GithubHelp home page GithubHelp logo

kakaobrain / trident Goto Github PK

View Code? Open in Web Editor NEW
177.0 4.0 11.0 526 KB

A performance library for machine learning applications.

Home Page: https://www.kakaobrain.com

License: Apache License 2.0

Python 99.95% Shell 0.05%
ai library performance triton deep-learning python pytorch machine-learning

trident's Introduction

Trident

Welcome

๐Ÿ”ฑ Overview

Trident is a performance library for machine learning applications intended for acceleration of training and inference. Trident includes highly optimized kernels, functions and modules for machine learning. Trident is implemented based on OpenAI Triton. Check Wiki for more detail.

๐Ÿ’ป Requirements

  • Platform: Linux
  • Hardware: NVIDIA

๐Ÿ“ฆ Installation

bash install_package.sh

You can also install Trident using pip.

pip install git+https://github.com/kakaobrain/trident.git

You can add Trident in requirements.txt.

trident@git+https://github.com/kakaobrain/trident.git@main

๐Ÿ“– How to use

how-to-use

๐Ÿง‘โ€๐Ÿ’ป Contribution

You must set up pre-commit to maintain the consistent coding style.

pre-commit install

trident's People

Contributors

ansteve avatar daemyung avatar mejai1206 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

trident's Issues

An error occurs when importing Trident

๐Ÿž Describe the bug

After building trident with the build script(install_package.sh), an error occurs when the library is imported.

>>> import trident
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/baron/dev/trident/trident/__init__.py", line 15, in <module>
    from . import function, kernel, util
  File "/home/baron/dev/trident/trident/function/__init__.py", line 15, in <module>
    from .function import *
  File "/home/baron/dev/trident/trident/function/function.py", line 19, in <module>
    from trident import operation
  File "/home/baron/dev/trident/trident/operation/__init__.py", line 15, in <module>
    from .adaptive_avg_pool2d import *
  File "/home/baron/dev/trident/trident/operation/adaptive_avg_pool2d.py", line 17, in <module>
    from trident import kernel
  File "/home/baron/dev/trident/trident/kernel/__init__.py", line 23, in <module>
    from .gelu import *
  File "/home/baron/dev/trident/trident/kernel/gelu.py", line 21, in <module>
    class GELU:
  File "/home/baron/dev/trident/trident/kernel/gelu.py", line 32, in GELU
    @triton.autotune(configs(), ["x_size"])
TypeError: 'staticmethod' object is not callable

The build was successful as shown below.

~/dev/trident/.triton/python ~/dev/trident
Already up to date.
Found existing installation: triton 2.1.0
Uninstalling triton-2.1.0:
  Successfully uninstalled triton-2.1.0
Processing /home/baron/dev/trident/.triton/python
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
Requirement already satisfied: filelock in /home/baron/anaconda3/envs/py38/lib/python3.8/site-packages (from triton==2.1.0) (3.12.3)
Requirement already satisfied: typing-extensions>=4.7.1 in /home/baron/anaconda3/envs/py38/lib/python3.8/site-packages (from filelock->triton==2.1.0) (4.7.1)
Building wheels for collected packages: triton
  Building wheel for triton (pyproject.toml) ... done
  Created wheel for triton: filename=triton-2.1.0-cp38-cp38-linux_x86_64.whl size=103818846 sha256=82a3ad0fbee4aea1b92e5ef759e47e170c7866792fa8e6b144993ac7822f3b91
  Stored in directory: /tmp/pip-ephem-wheel-cache-l9b57779/wheels/60/6a/5b/828e91e92f298f2433e6489cdac57e7545431ca3c351ab973f
Successfully built triton
Installing collected packages: triton
Successfully installed triton-2.1.0
~/dev/trident
Found existing installation: trident 0.1.0
Uninstalling trident-0.1.0:
  Successfully uninstalled trident-0.1.0
Obtaining file:///home/baron/dev/trident
  Installing build dependencies ... done
  Checking if build backend supports build_editable ... done
  Getting requirements to build editable ... done
  Preparing editable metadata (pyproject.toml) ... done
Requirement already satisfied: pytest in /home/baron/anaconda3/envs/py38/lib/python3.8/site-packages (from trident==0.1.0) (7.4.0)
Requirement already satisfied: matplotlib in /home/baron/anaconda3/envs/py38/lib/python3.8/site-packages (from trident==0.1.0) (3.7.2)
Requirement already satisfied: pandas in /home/baron/anaconda3/envs/py38/lib/python3.8/site-packages (from trident==0.1.0) (2.0.3)
Requirement already satisfied: contourpy>=1.0.1 in /home/baron/anaconda3/envs/py38/lib/python3.8/site-packages (from matplotlib->trident==0.1.0) (1.1.0)
Requirement already satisfied: cycler>=0.10 in /home/baron/anaconda3/envs/py38/lib/python3.8/site-packages (from matplotlib->trident==0.1.0) (0.11.0)
Requirement already satisfied: fonttools>=4.22.0 in /home/baron/anaconda3/envs/py38/lib/python3.8/site-packages (from matplotlib->trident==0.1.0) (4.42.1)
Requirement already satisfied: kiwisolver>=1.0.1 in /home/baron/anaconda3/envs/py38/lib/python3.8/site-packages (from matplotlib->trident==0.1.0) (1.4.5)
Requirement already satisfied: numpy>=1.20 in /home/baron/.local/lib/python3.8/site-packages (from matplotlib->trident==0.1.0) (1.21.4)
Requirement already satisfied: packaging>=20.0 in /home/baron/anaconda3/envs/py38/lib/python3.8/site-packages (from matplotlib->trident==0.1.0) (23.0)
Requirement already satisfied: pillow>=6.2.0 in /home/baron/.local/lib/python3.8/site-packages (from matplotlib->trident==0.1.0) (9.1.0)
Requirement already satisfied: pyparsing<3.1,>=2.3.1 in /home/baron/anaconda3/envs/py38/lib/python3.8/site-packages (from matplotlib->trident==0.1.0) (3.0.9)
Requirement already satisfied: python-dateutil>=2.7 in /home/baron/anaconda3/envs/py38/lib/python3.8/site-packages (from matplotlib->trident==0.1.0) (2.8.2)
Requirement already satisfied: importlib-resources>=3.2.0 in /home/baron/anaconda3/envs/py38/lib/python3.8/site-packages (from matplotlib->trident==0.1.0) (6.0.1)
Requirement already satisfied: pytz>=2020.1 in /home/baron/anaconda3/envs/py38/lib/python3.8/site-packages (from pandas->trident==0.1.0) (2023.3)
Requirement already satisfied: tzdata>=2022.1 in /home/baron/anaconda3/envs/py38/lib/python3.8/site-packages (from pandas->trident==0.1.0) (2023.3)
Requirement already satisfied: iniconfig in /home/baron/anaconda3/envs/py38/lib/python3.8/site-packages (from pytest->trident==0.1.0) (2.0.0)
Requirement already satisfied: pluggy<2.0,>=0.12 in /home/baron/anaconda3/envs/py38/lib/python3.8/site-packages (from pytest->trident==0.1.0) (1.3.0)
Requirement already satisfied: exceptiongroup>=1.0.0rc8 in /home/baron/anaconda3/envs/py38/lib/python3.8/site-packages (from pytest->trident==0.1.0) (1.1.3)
Requirement already satisfied: tomli>=1.0.0 in /home/baron/anaconda3/envs/py38/lib/python3.8/site-packages (from pytest->trident==0.1.0) (2.0.1)
Requirement already satisfied: zipp>=3.1.0 in /home/baron/anaconda3/envs/py38/lib/python3.8/site-packages (from importlib-resources>=3.2.0->matplotlib->trident==0.1.0) (3.11.0)
Requirement already satisfied: six>=1.5 in /home/baron/anaconda3/envs/py38/lib/python3.8/site-packages (from python-dateutil>=2.7->matplotlib->trident==0.1.0) (1.16.0)
Building wheels for collected packages: trident
  Building editable for trident (pyproject.toml) ... done
  Created wheel for trident: filename=trident-0.1.0-0.editable-py3-none-any.whl size=6783 sha256=80404a44041fa2129ce95b642fbc8f18d77f665a21bc37cec771def9dc87cf22
  Stored in directory: /tmp/pip-ephem-wheel-cache-l3sz7f87/wheels/65/cb/8f/bf5271659251e361feab9cce4f28f60cb0319ca4ee41b4041a
Successfully built trident
Installing collected packages: trident
Successfully installed trident-0.1.0

๐Ÿ’ป Requirements

  • Platform: Ubuntu 22.04.2 LTS(WSL2)
  • Version: Python 3.8.17, PyTorch 1.13.0

๐Ÿ’ฌ Additional context

If I move the configs function (staticmethod) out of the GELU class, the error will disappear in that area.

Bugs in Attention benchmark

๐Ÿž Describe the bug

Running the benchmarks/bechmarker.py yields an error in the attention scenario.

๐Ÿง‘โ€๐Ÿซ Reproduction

Just install latest version following instructions from #159 (comment) and run:

(python310) root@mymachine-17037-1045294:~/trident/benchmarks# CUDA_LAUNCH_BLOCKING=1 python benchmarker.py --scenario attention
Traceback (most recent call last):
  File "/root/trident/benchmarks/benchmarker.py", line 191, in <module>
    main()
  File "/root/trident/benchmarks/benchmarker.py", line 182, in main
    run_benchmarks(
  File "/root/trident/benchmarks/benchmarker.py", line 83, in run_benchmarks
    benchmark_attention.run_benchmark(mode, show_plots, dtype)
  File "/root/trident/benchmarks/benchmark_attention.py", line 62, in run_benchmark
    bench_attention_forward.run(print_data=True, show_plots=show_plots, dtype=dtype)
  File "/opt/conda/envs/python310/lib/python3.10/site-packages/triton/testing.py", line 337, in run
    self._run(bench, save_path, show_plots, print_data, **kwargs)
  File "/opt/conda/envs/python310/lib/python3.10/site-packages/triton/testing.py", line 289, in _run
    ret = self.fn(**x_args, **{bench.line_arg: y}, **bench.args, **kwrags)
  File "/root/trident/benchmarks/benchmark_attention.py", line 34, in bench_attention_forward
    return triton.testing.do_bench(
  File "/opt/conda/envs/python310/lib/python3.10/site-packages/triton/testing.py", line 105, in do_bench
    fn()
  File "/root/trident/benchmarks/benchmark_attention.py", line 35, in <lambda>
    lambda: trident.function.scaled_dot_product_attention(query, key, value, use_accelerator=True)
  File "/opt/conda/envs/python310/lib/python3.10/site-packages/trident/function/function.py", line 251, in scaled_dot_product_attention
    return operation.Attention.apply(
  File "/opt/conda/envs/python310/lib/python3.10/site-packages/torch/autograd/function.py", line 539, in apply
    return super().apply(*args, **kwargs)  # type: ignore[misc]
  File "/opt/conda/envs/python310/lib/python3.10/site-packages/trident/operation/attention.py", line 38, in forward
    output, log_sum_exp = Attention.__forward(
  File "/opt/conda/envs/python310/lib/python3.10/site-packages/trident/operation/attention.py", line 99, in __forward
    kernel.Attention.forward[grid](
  File "/opt/conda/envs/python310/lib/python3.10/site-packages/triton/runtime/autotuner.py", line 104, in run
    timings = {config: self._bench(*args, config=config, **kwargs)
  File "/opt/conda/envs/python310/lib/python3.10/site-packages/triton/runtime/autotuner.py", line 104, in <dictcomp>
    timings = {config: self._bench(*args, config=config, **kwargs)
  File "/opt/conda/envs/python310/lib/python3.10/site-packages/triton/runtime/autotuner.py", line 87, in _bench
    return do_bench(kernel_call, warmup=self.warmup, rep=self.rep, quantiles=(0.5, 0.2, 0.8))
  File "/opt/conda/envs/python310/lib/python3.10/site-packages/triton/testing.py", line 105, in do_bench
    fn()
  File "/opt/conda/envs/python310/lib/python3.10/site-packages/triton/runtime/autotuner.py", line 81, in kernel_call
    self.fn.run(*args, num_warps=config.num_warps, num_stages=config.num_stages,
  File "<string>", line 4, in forward
  File "/opt/conda/envs/python310/lib/python3.10/site-packages/triton/runtime/jit.py", line 410, in launcher_body
    bin.c_wrapper(grid_0, grid_1, grid_2, bin.num_warps, bin.num_ctas, bin.clusterDims[0], bin.clusterDims[1], bin.clusterDims[2], bin.shared, stream, bin.cu_function, CompiledKernel.launch_enter_hook, CompiledKernel.launch_exit_hook, bin, *args)
RuntimeError: Triton Error [CUDA]: an illegal memory access was encountered

๐ŸŽฏ Expected behavior

Ideally it should just give the running times as in the argmax case:

(python310) root@mymachine-17037-1045294:~/trident/benchmarks# python benchmarker.py
argmax forward:
    x_size     torch   trident
0    128.0  0.004781  0.002036
1    256.0  0.005041  0.002055
2    384.0  0.005651  0.002100
3    512.0  0.006145  0.002124
4    640.0  0.006773  0.002186
5    768.0  0.007327  0.002097
6    896.0  0.008035  0.002210
7   1024.0  0.008468  0.002203
8   1152.0  0.009113  0.002335
9   1280.0  0.009662  0.002358
10  1408.0  0.010142  0.002305
11  1536.0  0.010683  0.002369
12  1664.0  0.011376  0.002410
13  1792.0  0.011718  0.002455
14  1920.0  0.012365  0.002451
15  2048.0  0.012884  0.002436
16  2176.0  0.013410  0.002749
17  2304.0  0.013806  0.002733
18  2432.0  0.014543  0.002740
19  2560.0  0.015103  0.002776

๐Ÿ–ผ๏ธ Screenshots

.

๐Ÿ’ป Requirements

  • Platform: Ubuntu 20.04.5 LTS
  • Hardware: Nvidia V100 32 Gb card.
  • Version: pytorch 2.1, triton-nightly, trident 1.0.2

๐Ÿ’ฌ Additional context

Running the function individually in ipython worked for a simple case:

import torch as th
import trident.functional as tdf

q,k,v = th.randn(3, 2, 4, 8, 16).cuda()
tdf.scaled_dot_product_attention(q, k, v, use_accelerator=True)

BTW: It would be very helpful if an updated result of running pytorch bechmarker.py could be provided in the wiki, so it can be can be seen which functions can be really accelerated (and by which amount) by trident

Bias in Attention isn't supported

๐Ÿ™‹ Describe the feature

I would like to have the bias argument in the attention API, as it is used in many models and would favour Trident adoption.

๐Ÿ’ฌ Additional context

In the following equation, l denotes layer and h denotes head:
Captura de Pantalla 2023-09-14 a las 13 21 06

Tutorial (tutorial.ipynb) fails

๐Ÿž Describe the bug

After successfully building with the help of the link, I tried running the tutorial, but it is failing.

Cell In[2], line 26, in Net.forward(self, input)
     23 # RNN output shape is (seq_len, batch, input_size)
     24 # Get last output of RNN
     25 output = output[:, -1, :]
---> 26 output = self.norm(output)
     27 output = self.dropout1(output)
     28 output = self.fc1(output)

File [~/anaconda3/envs/py38/lib/python3.8/site-packages/torch/nn/modules/module.py:1190](https://vscode-remote+wsl-002bubuntu.vscode-resource.vscode-cdn.net/home/baron/dev/trident/examples/~/anaconda3/envs/py38/lib/python3.8/site-packages/torch/nn/modules/module.py:1190), in Module._call_impl(self, *input, **kwargs)
...
     35     ) = args
     37     if use_input_stats:
     38         InstanceNorm.__optimize(inp, run_mean, run_var, momentum)

ValueError: too many values to unpack (expected 8)

The context for performing the backward operation is passed as the first argument in the forward function of torch.autograd.Function, but only custom ops are used in the custom class(e.g: InstanceNorm, ReLU, ... ).

Am I missing something?

๐Ÿ’ป Requirements

  • Platform: Ubuntu 22.04.2 LTS(WSL2)
  • Version: Python 3.8.17, PyTorch 1.13.0

๐Ÿ’ฌ Additional context

Of course, it works well if you modify the forward function as follows.

(
class InstanceNorm(torch.autograd.Function):
    @staticmethod
    def forward(*args, **kwargs):
        (
            ctx, # This variable was added
            inp,
            run_mean,
            run_var,
            wgt,
            bis,
            use_input_stats,
            momentum,
            eps,
        ) = args

        if use_input_stats:
            InstanceNorm.__optimize(inp, run_mean, run_var, momentum)
            run_mean = run_var = None

        return InstanceNorm.__forward(
            inp,
            run_mean,
            run_var,
            wgt,
            bis,
            eps,
        )

Can't import latest version of Trident

๐Ÿž Describe the bug

Can't import the latest version of triton after following the installation steps, on a linux machine with an NVidia T4 GPU and CUDA version 12.0.

๐Ÿง‘โ€๐Ÿซ Reproduction

To reproduce:

conda create -n python310 python=3.10 --yes
conda activate python310
pip3 install ipython torch torchvision torchaudio
git clone https://github.com/kakaobrain/trident
cd trident 
bash install_package.sh
cd ..
ipython
>>> import trident as tr

๐ŸŽฏ Expected behavior

Importing it should just work

๐Ÿ–ผ๏ธ Screenshots

Here's my stacktrace:
And the error i'm getting is:

ipython
imPython 3.10.13 (main, Sep 11 2023, 13:44:35) [GCC 11.2.0]
Type 'copyright', 'credits' or 'license' for more information
IPython 8.16.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import trident as tr
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[1], line 1
----> 1 import trident as tr

File ~/trident/trident/__init__.py:15
      1 # Copyright 2023 โ“’ Kakao Brain Corp.
      2 #
      3 # Licensed under the Apache License, Version 2.0 (the "License");
   (...)
     12 # See the License for the specific language governing permissions and
     13 # limitations under the License.
---> 15 from . import function, kernel, util
     16 from .config import *
     17 from .module import *

File ~/trident/trident/function/__init__.py:15
      1 # Copyright 2023 โ“’ Kakao Brain Corp.
      2 #
      3 # Licensed under the Apache License, Version 2.0 (the "License");
   (...)
     12 # See the License for the specific language governing permissions and
     13 # limitations under the License.
---> 15 from .function import *

File ~/trident/trident/function/function.py:21
     17 from typing import Optional, Tuple, Union
     19 import torch
---> 21 from trident import operation
     24 def argmax(input: torch.Tensor, dim: int):
     25     """
     26     Returns the indices of the maximum value of all elements in an input.
     27     """

File ~/trident/trident/operation/__init__.py:15
      1 # Copyright 2023 โ“’ Kakao Brain Corp.
      2 #
      3 # Licensed under the Apache License, Version 2.0 (the "License");
   (...)
     12 # See the License for the specific language governing permissions and
     13 # limitations under the License.
---> 15 from .argmax import *
     16 from .attention import *
     17 from .batch_norm import *

File ~/trident/trident/operation/argmax.py:20
     17 import torch
     18 import triton
---> 20 from trident import kernel, util
     23 class Argmax(torch.autograd.Function):
     24     @staticmethod
     25     def forward(ctx: Any, *args: Any, **kwargs: Any):

File ~/trident/trident/kernel/__init__.py:15
      1 # Copyright 2023 โ“’ Kakao Brain Corp.
      2 #
      3 # Licensed under the Apache License, Version 2.0 (the "License");
   (...)
     12 # See the License for the specific language governing permissions and
     13 # limitations under the License.
---> 15 from .argmax import *
     16 from .attention import *
     17 from .batch_norm import *

File ~/trident/trident/kernel/argmax.py:19
     15 import triton
     16 import triton.language as tl
---> 19 class Argmax:
     20     @staticmethod
     21     @triton.heuristics({"require_x_boundary_check": lambda args: args["x_size"] % args["x_block_size"]})
     22     @triton.jit
   (...)
     32         require_x_boundary_check: tl.constexpr,
     33     ):
     34         y_offset = tl.program_id(0)

File ~/trident/trident/kernel/argmax.py:23, in Argmax()
     19 class Argmax:
     20     @staticmethod
     21     @triton.heuristics({"require_x_boundary_check": lambda args: args["x_size"] % args["x_block_size
     28         y_stride: tl.int32,
     29         x_stride: tl.int32,
     30         dtype: tl.constexpr,
     31         x_block_size: tl.constexpr,
     32         require_x_boundary_check: tl.constexpr,
     33     ):
     34         y_offset = tl.program_id(0)
     36         output_block_ptr = tl.make_block_ptr(
     37             output_ptr,
     38             shape=(y_size,),
   (...)
     42             order=(0,),
     43         )

File /opt/conda/envs/python310/lib/python3.10/site-packages/triton/runtime/jit.py:542, in jit(fn, version, do_not_specialize, debug, noinline, interpret)
    534         return JITFunction(
    535             fn,
    536             version=version,
   (...)
    539             noinline=noinline,
    540         )
    541 if fn is not None:
--> 542     return decorator(fn)
    544 else:
    545     return decorator

File /opt/conda/envs/python310/lib/python3.10/site-packages/triton/runtime/jit.py:534, in jit.<locals>.decorator(fn)                                    [0/569]
    532     return GridSelector(fn)
    533 else:
--> 534     return JITFunction(
    535         fn,
    536         version=version,
    537         do_not_specialize=do_not_specialize,
    538         debug=debug,
    539         noinline=noinline,
    540     )

File /opt/conda/envs/python310/lib/python3.10/site-packages/triton/runtime/jit.py:431, in JITFunction.__init__(self, fn, version, do_not_specialize, debug, noinline)
    429 self.__annotations__ = {name: normalize_ty(ty) for name, ty in fn.__annotations__.items()}
    430 # index of constexprs
--> 431 self.constexprs = [self.arg_names.index(name) for name, ty in self.__annotations__.items() if 'constexpr' in ty]
    432 # launcher
    433 self.run = self._make_launcher()

File /opt/conda/envs/python310/lib/python3.10/site-packages/triton/runtime/jit.py:431, in <listcomp>(.0)
    429 self.__annotations__ = {name: normalize_ty(ty) for name, ty in fn.__annotations__.items()}
    430 # index of constexprs
--> 431 self.constexprs = [self.arg_names.index(name) for name, ty in self.__annotations__.items() if 'constexpr' in ty]
    432 # launcher
    433 self.run = self._make_launcher()

TypeError: argument of type 'dtype' is not iterable

In [2]: import triton.language as tl

In [3]: tl.load
Out[3]: <function triton.language.core.load(pointer, mask=None, other=None, boundary_check=(), padding_option='', cache_modifier='', eviction_policy='', volatile=False, _builder=None)>

๐Ÿ’ป Requirements

  • Platform: Linux
  • Hardware: Nvidia Tesla T4
  • Version: CUDA 12.0, Trident latest github version v1.0.2 but also experienced it with master branch.

๐Ÿ’ฌ Additional context

If you could share either a conda yaml or a requirements.txt that would make it just work, that would be awesome.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.