StarCoder (コード生成用大規模言語モデル) : 概要

💫 StarCoder 概要 (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 06/11/2023

* 本ページは、BigCode Project / StarCoder の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

クラスキャット 人工知能 研究開発支援サービス

クラスキャット は人工知能・テレワークに関する各種サービスを提供しています。お気軽にご相談ください :

◆ 人工知能とビジネスをテーマに WEB セミナーを定期的に開催しています。スケジュール
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

  • 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
  • sales-info@classcat.com  ;  Web: www.classcat.com  ;   ClassCatJP

 

💫 StarCoder : 概要

What is this about?

💫 StarCoder はソースコードと自然言語テキスト上で訓練された言語モデル (LM) です。その訓練データは 80 以上の様々なプログラミング言語と GitHub issues とコミットとノートブックから抽出されたテキストを組み込んでいます。このレポジトリはこの LM の機能の概要を得る方法を紹介します。

 
News

  • May 9, 2023 : 役に立つコーディングアシスタント💬 として動作するように StarCoder を再調整しました!訓練コード用の chat/ ディレクトリを確認して、ここ でモデルで遊んでください。

 
免責条項

モデルを使用する前に、hf.co/bigcode/starcoder に行って同意書を承認してください。そして以下で Hugging Face hub にログインしていることを確実にしてください :

huggingface-cli login

 

クイックスタート

StarCoder は GitHub コードで訓練されましたので、それはコード生成を実行するために利用できます。より正確には、モデルは関数の実装を完成させたり、コード行の次のキャラクターを推論することができます。これは 🤗 の transformers ライブラリの支援により成されます。

 

インストール

まず、requirements.txt で列挙されているすべてのライブラリをインストールする必要があります。

pip install -r requirements.txt

 

コード生成

コード生成パイプラインは以下のようなものです :

from transformers import AutoModelForCausalLM, AutoTokenizer

checkpoint = "bigcode/starcoder"
device = "cuda" # for GPU usage or "cpu" for CPU usage

tokenizer = AutoTokenizer.from_pretrained(checkpoint)
# to save memory consider using fp16 or bf16 by specifying torch_dtype=torch.float16 for example
model = AutoModelForCausalLM.from_pretrained(checkpoint).to(device)

inputs = tokenizer.encode("def print_hello_world():", return_tensors="pt").to(device)
outputs = model.generate(inputs)
# clean_up_tokenization_spaces=False prevents a tokenizer edge case which can result in spaces being removed around punctuation
print(tokenizer.decode(outputs[0], clean_up_tokenization_spaces=False))

or

from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
checkpoint = "bigcode/starcoder"

model = AutoModelForCausalLM.from_pretrained(checkpoint)
tokenizer = AutoTokenizer.from_pretrained(checkpoint)

pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, device=0)
print( pipe("def hello():") )

ハードウェア要件については、セクション 推論ハードウェア要件 を確認してください。

 

テキスト生成推論

docker run -p 8080:80 -v $PWD/data:/data -e HUGGING_FACE_HUB_TOKEN= -d  ghcr.io/huggingface/text-generation-inference:latest --model-id bigcode/starcoder --max-total-tokens 8192

詳細は こちら をご覧ください。

 

再調整

ここでは、この LM を特定の下流タスクで再調整する方法を紹介します。

 

conda によるステップ毎のインストール

新しい conda 環境を作成してそれを activate します。

conda create -n env
conda activate env

貴方の cuda のバージョンと互換な pytorch のバージョンを こちら でインストールします、例えば以下のコマンドは cuda 11.6 で動作します :

conda install pytorch==1.13.1 torchvision==0.14.1 torchaudio==0.13.1 pytorch-cuda=11.6 -c pytorch -c nvidia

transformers と peft をインストールします :

conda install -c huggingface transformers 
pip install git+https://github.com/huggingface/peft.git

以下を使用して transformers の最新安定版をインストールできることに注意してください :

pip install git+https://github.com/huggingface/transformers

datasets, accelerate と huggingface_hub をインストールします :

conda install -c huggingface -c conda-forge datasets
conda install -c conda-forge accelerate
conda install -c conda-forge huggingface_hub

最後に、bitsandbytes と wandb をインストールします :

pip install bitsandbytes
pip install wandb

說明を伴う引数の完全なリストを取得するにはどのスクリプトでも以下のコマンドを実行できます :

python scripts/some_script.py --help

任意のスクリプトを実行する前に貴方はログインしてハブにプッシュできることを確実にしてください :

huggingface-cli login

wandb にログインしていることを確認します :

wandb login

すべてが完了した今、レポジトリを複製して対応するディレクトリに入ることができます。

 

データセット

💫 StarCoder は複数の下流タスクを実現するために再調整することができます。ここでの私たちの興味は指示 (instructions) に従うように StarCoder を再調整することです。指示調整 ( instruction fine-tuning ) は最近多くの注目を集めています、それは言語モデルにその出力を人間のニーズに合わせることを教える、単純なフレームワークを提示するからです。そのような手続きは、複数の指示 – 答えのペアを含む、質の高い指示データセットが利用可能であることが必要です。残念ながらそのようなデータセットはどこにでもあるわけではありませんが、Hugging Face 🤗 の datasets ライブラリのおかげで、幾つかの良いプロキシ (代替) にアクセスすることができます。安価にそして効率的に再調整するため、Hugging Face 🤗 の PEFT と Tim Dettmers の bitsandbytes を利用します。

 
Stack Exchange SE

Stack Exchange は多様な領域のトピックに関する Q&A web サイトの良く知られたネットワークです。そこは、ユーザが質問して他のユーザから回答を得られる場所です。それらの回答はそれらの質に基づいてスコアリングされてランク付けされます。Stack exchange instruction は Q&A ペアのコレクションを構築するためにサイトからかき集めて得られたデータセットです。そして言語モデルはそのデータセット上で、明白に強力で多様な質問応答スキルを持つように再調整できます。

再調整スクリプトを実行するには、以下のコマンドを実行します :

python finetune/finetune.py \
  --model_path="bigcode/starcoder"\
  --dataset_name="ArmelR/stack-exchange-instruction"\
  --subset="data/finetune"\
  --split="train"\
  --size_valid_set 10000\
  --streaming\
  --seq_length 2048\
  --max_steps 1000\
  --batch_size 1\
  --input_column_name="question"\
  --output_column_name="response"\ 
  --gradient_accumulation_steps 16\
  --learning_rate 1e-4\
  --lr_scheduler_type="cosine"\
  --num_warmup_steps 100\
  --weight_decay 0.05\
  --output_dir="./checkpoints" \

SE データセットのサイズはストリーミングを使用するときより良く管理できます。また使用するデータセットの正確な分割を行う必要もあります。詳細は、🤗 の データセットのページ を確認してください。同様に GPU の可用性を構成するためにコマンドを変更できます。

python -m torch.distributed.launch \
  --nproc_per_node number_of_gpus finetune/finetune.py \
  --model_path="bigcode/starcoder"\
  --dataset_name="ArmelR/stack-exchange-instruction"\
  --subset="data/finetune"\
  --split="train"\
  --size_valid_set 10000\
  --streaming \
  --seq_length 2048\
  --max_steps 1000\
  --batch_size 1\
  --input_column_name="question"\
  --output_column_name="response"\ 
  --gradient_accumulation_steps 16\
  --learning_rate 1e-4\
  --lr_scheduler_type="cosine"\
  --num_warmup_steps 100\
  --weight_decay 0.05\
  --output_dir="./checkpoints" \

 

PEFT アダプター層のマージ

モデルを PEFT で訓練した場合、推論 / 評価を実行するにはアダプター層をベースモデルとマージする必要があります。そのためには、以下を実行します :

python finetune/merge_peft_adapters.py --base_model_name_or_path model_to_merge --peft_model_path model_checkpoint

# Push merged model to the Hub
python finetune/merge_peft_adapters.py --base_model_name_or_path model_to_merge --peft_model_path model_checkpoint --push_to_hub

例えば :

python finetune/merge_peft_adapters.py --model_name_or_path bigcode/starcoder --peft_model_path checkpoints/checkpoint-1000 --push_to_hub

 

評価

StarCoder とその派生を評価するために、コード LLM を評価するための BigCode-Evaluation-Harness を利用できます。

 

推論ハードウェア要件

FP32 では 60GB 以上の RAM を必要としますが、以下によりそれを FP16 or BF16 では ~30GB、あるいは 8bit では 20GB 以下の RAM でロードできます :

# make sure you have accelerate and bitsandbytes installed
from transformers import AutoModelForCausalLM, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("bigcode/starcoder")
# for fp16 replace with  `load_in_8bit=True` with   `torch_dtype=torch.float16`
model = AutoModelForCausalLM.from_pretrained("bigcode/starcoder", device_map="auto", load_in_8bit=True)
print(f"Memory footprint: {model.get_memory_footprint() / 1e6:.2f} MB")
Memory footprint: 15939.61 MB

You can also try starcoder.cpp, a C++ implementation with ggml library.

 

以上