Giter VIP home page Giter VIP logo

grounding_llms_with_online_rl's Introduction

Grounding Large Language Models with Online Reinforcement Learning

This repository contains the code used for our paper Grounding Large Language Models with Online Reinforcement Learning.

You can find more information on our website.

We perform functional grounding of LLMs' knowledge in BabyAI-Text using the GLAM method: Main schema

We release our BabyAI-Text environment along with the code to perform our experiments (both training agents and evaluating their performance). We rely on the Lamorel library to use LLMs.

Our repository is structured as follows:

๐Ÿ“ฆ Grounding_LLMs_with_online_RL
โ”ฃ ๐Ÿ“‚ babyai-text -- our BabyAI-Text environment
โ”ฃ ๐Ÿ“‚ experiments -- code for our experiments
โ”ƒ โ”ฃ ๐Ÿ“‚ agents -- implementation of all our agents
โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚ bot -- bot agent leveraging BabyAI's bot
โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚ random_agent -- agent playing uniformly random
โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚ drrn -- DRRN agent from here
โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚ ppo -- agents using PPO
โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œ symbolic_ppo_agent.py -- SymbolicPPO adapted from BabyAI's PPO
โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œ llm_ppo_agent.py -- our LLM agent grounded using PPO
โ”ƒ โ”ฃ ๐Ÿ“‚ configs -- Lamorel configs for our experiments
โ”ƒ โ”ฃ ๐Ÿ“‚ slurm -- utils scripts to launch our experiments on a SLURM cluster
โ”ƒ โ”ฃ ๐Ÿ“‚ campaign -- SLURM scripts used to launch our experiments
โ”ƒ โ”ฃ ๐Ÿ“œ train_language_agent.py -- train agents using BabyAI-Text (LLMs and DRRN) -> contains our implementation of PPO loss for LLMs as well as additional heads on top of LLMs
โ”ƒ โ”ฃ ๐Ÿ“œ train_symbolic_ppo.py -- train SymbolicPPO on BabyAI (with BabyAI-Text's tasks)
โ”ƒ โ”ฃ ๐Ÿ“œ post-training_tests.py -- generalization tests of trained agents
โ”ƒ โ”ฃ ๐Ÿ“œ test_results.py -- utils to format results
โ”ƒ โ”— ๐Ÿ“œ clm_behavioral-cloning.py -- code to perform Behavioral Cloning on an LLM using trajectories

Installation steps

  1. Create conda env
conda create -n dlp python=3.10.8; conda activate dlp
  1. Install PyTorch
conda install pytorch==1.12.1 torchvision==0.13.1 torchaudio==0.12.1 cudatoolkit=11.3 -c pytorch
  1. Install packages required by our package
pip install -r requirements.txt
  1. Install BabyAI-Text: See installation details in the babyai-text package

  2. Install Lamorel

git clone https://github.com/flowersteam/lamorel.git; cd lamorel/lamorel; pip install -e .; cd ../..

Launch

Please use Lamorel along with our configs. You can find examples of our training scripts in campaign.

Training a Language Model

To train a Language Model on a BabyAI-Text environment, one must use the train_language_agent.py file. This script (launched with Lamorel) uses the following config entries:

rl_script_args:
  seed: 1
  number_envs: 2 # Number of parallel envs to launch (steps will be synchronized, i.e. a step call will return number_envs observations)
  num_steps: 1000 # Total number of training steps
  max_episode_steps: 3 # Maximum number of steps in a single episode
  frames_per_proc: 40 # The number of collected transitions to perform a PPO update will be frames_per_proc*number_envs
  discount: 0.99 # Discount factor used in PPO
  lr: 1e-6 # Learning rate used to finetune the LLM
  beta1: 0.9 # PPO's hyperparameter
  beta2: 0.999 # PPO's hyperparameter
  gae_lambda: 0.99 # PPO's hyperparameter
  entropy_coef: 0.01 # PPO's hyperparameter
  value_loss_coef: 0.5 # PPO's hyperparameter
  max_grad_norm: 0.5 # Maximum grad norm when updating the LLM's parameters
  adam_eps: 1e-5 # Adam's hyperparameter
  clip_eps: 0.2 # Epsilon used in PPO's losses clipping
  epochs: 4 # Number of PPO epochs performed on each set of collected trajectories
  batch_size: 16 # Minibatch size
  action_space: ["turn_left","turn_right","go_forward","pick_up","drop","toggle"] # Possible actions for the agent
  saving_path_logs: ??? # Where to store logs
  name_experiment: 'llm_mtrl' # Useful for logging
  name_model: 'T5small' # Useful for logging
  saving_path_model: ??? # Where to store the finetuned model
  name_environment: 'BabyAI-MixedTestLocal-v0' # BabiAI-Text's environment 
  load_embedding: true # Whether trained embedding layers should be loaded (useful when lm_args.pretrained=False). Setting both this and use_action_heads to True (lm_args.pretrained=False) creates our NPAE agent.
  use_action_heads: false # Whether action heads should be used instead of scoring. Setting both this and use_action_heads to True (lm_args.pretrained=False) creates our NPAE agent.
  template_test: 1 # Which prompt template to use to log evolution of action's probability (Section C of our paper). Choices or [1, 2].
  nbr_obs: 3 # Number of past observation used in the prompt

For the config entries related to the Language Model itself, please see Lamorel.

Evaluating performances on test episodes

To evaluate the performance of an agent (e.g. a trained LLM, BabyAI's bot...) on test tasks, use post-training_tests.py and set the following config entries:

rl_script_args:
  seed: 1
  number_envs: 2 # Number of parallel envs to launch (steps will be synchronized, i.e. a step call will return number_envs observations)
  max_episode_steps: 3 # Maximum number of steps in a single episode
  action_space: ["turn_left","turn_right","go_forward","pick_up","drop","toggle"] # Possible actions for the agent
  saving_path_logs: ??? # Where to store logs
  name_experiment: 'llm_mtrl' # Useful for logging
  name_model: 'T5small' # Useful for logging
  saving_path_model: ??? # Where to store the finetuned model
  name_environment: 'BabyAI-MixedTestLocal-v0' # BabiAI-Text's environment 
  load_embedding: true # Whether trained embedding layers should be loaded (useful when lm_args.pretrained=False). Setting both this and use_action_heads to True (lm_args.pretrained=False) creates our NPAE agent.
  use_action_heads: false # Whether action heads should be used instead of scoring. Setting both this and use_action_heads to True (lm_args.pretrained=False) creates our NPAE agent.
  nbr_obs: 3 # Number of past observation used in the prompt
  number_episodes: 10 # Number of test episodes
  language: 'english' # Useful to perform the French experiment (Section H4)
  zero_shot: true # Whether the zero-shot LLM (i.e. without finetuning should be used)
  modified_action_space: false # Whether a modified action space (e.g. different from the one seen during training) should be used
  new_action_space: #["rotate_left","rotate_right","move_ahead","take","release","switch"] # Modified action space
  im_learning: false # Whether a LLM produced with Behavioral Cloning should be used
  im_path: "" # Path to the LLM learned with Behavioral Cloning
  bot: false # Whether the BabyAI's bot agent should be used

grounding_llms_with_online_rl's People

Contributors

clementromac 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  avatar  avatar  avatar

grounding_llms_with_online_rl's Issues

Question again ๏ผš๏ผ‰

Recently, I am working on your code stuff. And I just want to ask a question about GFLAN-T5.
Since this algorithm only updates the value head and uses the pre-trained language modeling heads.
But to my knowledge, if we only update the value head, that would not influence the parameters of the pre-trained language modeling heads, so how does the policy network improve its ability? (Sorry, it might be a simple question, but I just cannot get it.
Looking forward to your reply.
Thx

Run without using slurm

I got 2 mistakes
The first is ModuleNotFoundError
Traceback (most recent call last): File "/remote-home/btjiang/RL/Grounding_LLMs_with_online_RL/experiments/train_language_agent.py", line 27, in <module> from agents.drrn.drrn import DRRNAgent File "/remote-home/btjiang/RL/Grounding_LLMs_with_online_RL/experiments/agents/drrn/drrn.py", line 22, in <module> from experiments.agents.base_agent import BaseAgent ModuleNotFoundError: No module named 'experiments'
I have already pip installed everything as the readme file.

The second is something about accelerate
Traceback (most recent call last): File "/remote-home/btjiang/RL/lamorel/lamorel/src/lamorel_launcher/launch.py", line 46, in main launch_command(accelerate_args) File "/remote-home/btjiang/anaconda3/envs/dlp/lib/python3.10/site-packages/accelerate/commands/launch.py", line 985, in launch_command multi_gpu_launcher(args) File "/remote-home/btjiang/anaconda3/envs/dlp/lib/python3.10/site-packages/accelerate/commands/launch.py", line 654, in multi_gpu_launcher distrib_run.run(args) File "/remote-home/btjiang/anaconda3/envs/dlp/lib/python3.10/site-packages/torch/distributed/run.py", line 753, in run elastic_launch( File "/remote-home/btjiang/anaconda3/envs/dlp/lib/python3.10/site-packages/torch/distributed/launcher/api.py", line 132, in __call__ return launch_agent(self._config, self._entrypoint, list(args)) File "/remote-home/btjiang/anaconda3/envs/dlp/lib/python3.10/site-packages/torch/distributed/launcher/api.py", line 246, in launch_agent raise ChildFailedError( torch.distributed.elastic.multiprocessing.errors.ChildFailedError:
It looks like it's caused by accelerate not being able to execute two processes correctly. How can I fix it?

Customize BabyAI-Text

Hello, thank you so much for sharing this amazing work. I am using it for my project. However, I've observed that the current version is limited to supporting only a specific set of environments. Considering the potential and flexibility of BabyAI-Text, I am keen to extend its application to a wider range of environments, such as Key Corridor.
I would greatly appreciate any guidance or advice on how to effectively customize BabyAI-Text for additional environments. If there are any available documentation, tips, or starting points that could aid in this endeavor, it would be immensely helpful.
Thank you once again for your dedication to this project and for providing such a valuable resource to the community. I eagerly anticipate your guidance and am excited about exploring further possibilities with BabyAI-Text.

Distribution Caculate

Hi, because I don't know how to use Slurm on my server, so I just run the launch.py on my PC (8 GPUs).
And I set the
local_gpu_config.yaml

lamorel_args:
  log_level: debug
  allow_subgraph_use_whith_gradient: false
  distributed_setup_args:
    n_rl_processes: 1
    n_llm_processes: 2
  accelerate_args:
    config_file: accelerate/default_config.yaml
    machine_rank: 0
    num_machines: 3
  llm_args:
    model_type: seq2seq
    model_path: t5-large
    pretrained: true
    minibatch_size: 60
    pre_encode_inputs: true
    parallelism:
      use_gpu: true
      model_parallelism_size: 2
      synchronize_gpus_after_scoring: false
      empty_cuda_cache_after_scoring: false
  updater_args:
rl_script_args:
  path: ???
  seed: 1
  number_envs: 2  # PPO 2
  num_steps: 1000
  max_episode_steps: 3
  simplification_str: easy
  frames_per_proc: 40
  reward_shaping_beta: 0
  discount: 0.99
  lr: 1e-6
  beta1: 0.9
  beta2: 0.999
  gae_lambda: 0.99
  entropy_coef: 0.01
  value_loss_coef: 0.5
  max_grad_norm: 0.5
  adam_eps: 1e-5
  clip_eps: 0.2
  epochs: 40
  batch_size: 16
  action_space: ["turn_left","turn_right","go_forward","pick_up","drop","toggle"]
  saving_path_logs: ???
  name_experiment: 'llm_mtrl'
  name_model: 'T5small'
  saving_path_model: ???
  name_environment: 'BabyAI-MixedTestLocal-v0'
  number_episodes: 10
  language: 'english'
  load_embedding: true
  use_action_heads: false
  template_test: 1
  zero_shot: true
  modified_action_space: false
  new_action_space: #["rotate_left","rotate_right","move_ahead","take","release","switch"]
  spm_path: "YOUR_PATH_TO_PROJECT/experiments/agents/drrn/spm_models/unigram_8k.model"
  random_agent: true
  get_example_trajectories: false
  nbr_obs: 3
  im_learning: false
  im_path: ""
  bot: false

And default_config.yaml

compute_environment: LOCAL_MACHINE
deepspeed_config: { }
distributed_type: MULTI_GPU
fsdp_config: { }
machine_rank: 0
main_process_ip: 127.0.0.1
main_process_port: 12345
main_training_function: main
mixed_precision: 'no'
num_machines: 1
num_processes: 3
use_cpu: false

But I got this: (What's the matter? It seems that I cannot run the same LLM on two GPUs..)

Exception has occurred: RuntimeError
Expected all tensors to be on the same device, but found at least two devices, cuda:1 and cuda:0! (when checking argument for argument index in method wrapper__index_select)
File "/home/jovyan/Grounding_LLMs_with_online_RL/lamorel/lamorel/src/lamorel/server/llms/hf_llm.py", line 216, in forward
torch.repeat_interleave(result,
File "/home/jovyan/Grounding_LLMs_with_online_RL/lamorel/lamorel/src/lamorel/server/server.py", line 109, in _process_calls
llm_results.append(self._model(**_call))
File "/home/jovyan/Grounding_LLMs_with_online_RL/lamorel/lamorel/src/lamorel/server/server.py", line 131, in run
current_process_results = self._process_calls(calls_to_process)
File "/home/jovyan/Grounding_LLMs_with_online_RL/lamorel/lamorel/src/lamorel/server/server.py", line 65, in init
self.run()
File "/home/jovyan/Grounding_LLMs_with_online_RL/lamorel/lamorel/src/lamorel/caller.py", line 54, in init
Server(
File "/home/jovyan/Grounding_LLMs_with_online_RL/experiments/train_language_agent.py", line 384, in main
lm_server = Caller(config_args.lamorel_args, custom_updater=PPOUpdater(),
File "/home/jovyan/Grounding_LLMs_with_online_RL/experiments/train_language_agent.py", line 491, in
main()
RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:1 and cuda:0! (when checking argument for argument index in method wrapper__index_select)

Thank you so much.

About the average success rate image of paper.

Hi, guys, I got a question again.
I observed that from Fig.13 to Fig.16 in the paper, it seems like the beginning points of those curves are not starting at frame zero.
Do you miss something about that?

How to solve the "ModuleNotFoundError: No module named 'experiments'"?

I'm using 6GPUs on a single machine. This is my command:

python -m lamorel_launcher.launch --config-path Absolute/Path/To/Grounding_LLMs_with_online_RL/experiments/configs  --config-name local_gpu_config rl_script_args.path=Absolute/Path/To/Grounding_LLMs_with_online_RL/experiments/train_language_agent.py lamorel_args.accelerate_args.machine_rank=1

and

python -m lamorel_launcher.launch --config-path Absolute/Path/To/Grounding_LLMs_with_online_RL/experiments/configs  --config-name local_gpu_config rl_script_args.path=Absolute/Path/To/Grounding_LLMs_with_online_RL/experiments/train_language_agent.py lamorel_args.accelerate_args.machine_rank=0

It returns:
ModuleNotFoundError: No module named 'experiments'

Ask a question

Excuse me, I've recently been studying the excellent work of your team and I have a doubt:
My understanding of the whole process is that it first goes through step (a), then step (b) which generates the prompt, followed by the LLM in part (c) outputting results (such as what action to take next) through the prompt. By the final step (d), the system calls the PPO algorithm separately for policy generation and at the same time compares it with the output of the LLM. So, I think what the PPO is fine-tuning is actually the output of the LLM, but the description in the paper seems to indicate that the LLM itself was fine-tuned using PPO. This is where I'm not sure. Would you mind clarifying this for me?
Thank you very much!

How to run the train_language_agent.py without using slurm

Hi,

Because i don't know how to use the slurm, i try to directly run the train_lanuage_agent.py as the command in lamorel

python -m lamorel_launcher.launch --config-path /home/yanxue/Grounding/experiments/configs --config-name local_gpu_config rl_script_args.path=/home/yanxue/Grounding/experiments/train_language_agent.py
and my config is


lamorel_args:
  log_level: info
  allow_subgraph_use_whith_gradient: true
  distributed_setup_args:
    n_rl_processes: 1
    n_llm_processes: 1
  accelerate_args:
    config_file: accelerate/default_config.yaml
    machine_rank: 0
    num_machines: 1
  llm_args:
    model_type: seq2seq
    model_path: t5-small
    pretrained: true
    minibatch_size: 3
    parallelism:
      use_gpu: true
      model_parallelism_size: 1
      synchronize_gpus_after_scoring: false
      empty_cuda_cache_after_scoring: false
  updater_args:

But I meet the error:

[2023-09-14 20:45:32,837][torch.distributed.elastic.multiprocessing.api][ERROR] - failed (exitcode: 1) local_rank: 0 (pid: 3946796) of binary: /home/yanxue/anaconda3/envs/dlp/bin/python
Error executing job with overrides: ['rl_script_args.path=/home/yanxue/Grounding/experiments/train_language_agent.py']
Traceback (most recent call last):
File "/home/yanxue/Grounding/lamorel/lamorel/src/lamorel_launcher/launch.py", line 46, in main
launch_command(accelerate_args)
File "/home/yanxue/anaconda3/envs/dlp/lib/python3.10/site-packages/accelerate/commands/launch.py", line 909, in launch_command
multi_gpu_launcher(args)
File "/home/yanxue/anaconda3/envs/dlp/lib/python3.10/site-packages/accelerate/commands/launch.py", line 604, in multi_gpu_launcher
distrib_run.run(args)
File "/home/yanxue/anaconda3/envs/dlp/lib/python3.10/site-packages/torch/distributed/run.py", line 785, in run
elastic_launch(
File "/home/yanxue/anaconda3/envs/dlp/lib/python3.10/site-packages/torch/distributed/launcher/api.py", line 134, in call
return launch_agent(self._config, self._entrypoint, list(args))
File "/home/yanxue/anaconda3/envs/dlp/lib/python3.10/site-packages/torch/distributed/launcher/api.py", line 250, in launch_agent
raise ChildFailedError(
torch.distributed.elastic.multiprocessing.errors.ChildFailedError:

/home/yanxue/Grounding/experiments/train_language_agent.py FAILED

Failures:
[1]:
time : 2023-09-14_20:45:32
host : taizun-R282-Z96-00
rank : 1 (local_rank: 1)
exitcode : 1 (pid: 3946797)
error_file: <N/A>
traceback : To enable traceback see: https://pytorch.org/docs/stable/elastic/errors.html

Root Cause (first observed failure):
[0]:
time : 2023-09-14_20:45:32
host : taizun-R282-Z96-00
rank : 0 (local_rank: 0)
exitcode : 1 (pid: 3946796)
error_file: <N/A>
traceback : To enable traceback see: https://pytorch.org/docs/stable/elastic/errors.html

Could you kindly suggest why the error happen?

'NoneType' object has no attribute 'SIGTERM'

Hello, thank you so much for sharing this amazing work. I am using it for my project and I am encountering an error that I'm hoping you could help me with.

When I run sbatch Symbolic-PPO.slurm, got these error messages:

File "/data/users/xxx/Grounding_LLMs_with_online_RL/experiments/train_symbolic_ppo.py", line 353, in
algo = SymbolicPPOAgent(envs, acmodel, args.frames_per_proc, args.discount, args.lr, args.beta1, args.beta2,
TypeError: Can't instantiate abstract class SymbolicPPOAgent with abstract method generate_trajectories
Exception ignored in: <function ParallelShapedEnv.del at 0x7f7e40689750>
Traceback (most recent call last):
File "/data/users/xxx/Grounding_LLMs_with_online_RL/babyai-text/babyai/babyai/shaped_env.py", line 188, in del
File "/home/xxx/.conda/envs/dlp/lib/python3.10/multiprocessing/process.py", line 133, in terminate
File "/home/xxx/.conda/envs/dlp/lib/python3.10/multiprocessing/popen_fork.py", line 57, in terminate
AttributeError: 'NoneType' object has no attribute 'SIGTERM'

I would greatly appreciate any help you could provide in resolving this issue. If there's any additional information you need from me, please let me know. Thank you in advance for your time and assistance.

LoRA Fine-tune

import sys
sys. path.append("~/Grounding_LLMs_with_online_RL/peft/src")
from transformers import AutoModelForCausalLM, AutoModelForSeq2SeqLM, AutoTokenizer, AutoConfig
from peft import get_peft_config, get_peft_model, LoraConfig, TaskType, PeftModel, PeftConfig

peft_config = LoraConfig(task_type=TaskType.SEQ_2_SEQ_LM, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1)

class ModelTypesEnum(Enum):
    causal = AutoModelForCausalLM
    seq2seq = AutoModelForSeq2SeqLM

def load_hf_model_and_tokenizer(type, path, pretrained):
    print("Loading model {}".format(path))
    tokenizer = AutoTokenizer.from_pretrained(path)

    # Select class according to type
    model_class = ModelTypesEnum[type].value
    if pretrained:
        model = model_class.from_pretrained(path)
        model = get_peft_model(model, peft_config)
    else:
        config = AutoConfig.from_pretrained(path)
        model = model_class.from_config(config)

    if ModelTypesEnum[type] == ModelTypesEnum.causal:
        n_layers = model.config.n_layer
    elif ModelTypesEnum[type] == ModelTypesEnum.seq2seq:
        n_layers = len(model.encoder.block)
    else:
        raise NotImplementedError()

    return tokenizer, model, n_layers

Hi, @ClementRomac, I modified the code of lamorel/lamorel/src/lamorel/server/llms/utils/load_hf_model_and_tokenizer.py shows above, and it seems like running very well. Indeed, it saved some time.

Missing babyai.rl + string comparison syntax warning

Hi,

I've noticed the following problems in babyai repackaging:

  1. In setup.py, babyai.rl is not included and therefore will not be installed (e.g. if installed from git)
  2. there are many string comparisons in babyai/levels/levelgen.py and babyai/levels/levelgen.py using is and is not. These lead to SyntaxWarning such as SyntaxWarning: "is not" with a literal and should instead be == or !=.

Walls disappear if blocked by an object

In the original BabyAI environment, walls and closed doors would block the agent's view into the next room, while objects like blocks and balls never obstructed the agent's view of anything. But in BabyAI-Text, objects block the agent's view of a wall if the object is located directly between the agent and the wall. This doesn't seem like a faithful representation of the original BabyAI observations. Objects never block anything else in BabyAI-Text (either objects or doors), just walls.

A wall also disappears from view if the agent is directly aligned with a door, for instance, if the door is 3 blocks to the left, or 4 blocks forward, etc.

User warning in using babyai-text env

I have followed the README in babyai-text/ to install the env. But when i run the codes below:
'''
import gym
import babyai_text
env = gym.make("BabyAI_MixedTrainLocal")
'''
It turns out a lot of user warning:
image

How to fix it?

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.