紙 | ?ハグフェイスコレクション |ディスカッションページ
116 のプログラミング言語で書かれたコードでトレーニングされた、コード生成タスク (例: バグの修正、コードの説明、コードの文書化) 用のデコーダー専用コード モデルの Granite シリーズを紹介します。さまざまなタスクに関する Granite コード モデル ファミリーの包括的な評価により、当社のモデルが利用可能なオープン ソース コード LLM の中で常に最先端のパフォーマンスに達していることが実証されました。
Granite Code モデルの主な利点は次のとおりです。
Granite コード モデルファミリには、主に 2 つのバリエーションがあります。
ベース モデルと命令モデルの両方で、3B、8B、20B、および 34B パラメータのサイズが利用可能です。
コードの事前トレーニング データを準備するプロセスには、いくつかの段階が含まれます。まず、公開されているデータセット (例: GitHub Code Clean、Starcoder データ)、公開コード リポジトリ、および GitHub からの問題の組み合わせを収集します。次に、データが記述されているプログラミング言語 (ファイル拡張子に基づいて決定) に基づいて、収集されたコード データをフィルタリングします。次に、コード品質の低いデータも除外します。 3 番目に、厳密な重複排除とあいまいな重複排除の両方を含む積極的な重複排除戦略を採用し、(ほぼ) 同一のコード内容を持つドキュメントを削除します。最後に、HAP コンテンツ フィルターを適用して、モデルが憎悪、虐待、冒涜的な言葉を生成する可能性を減らします。また、当社は、PII コンテンツ (例: 名前、電子メール アドレス、キー、パスワード) を対応するトークン (例: ⟨NAME⟩、⟨EMAIL⟩、⟨KEY⟩、⟨PASSWORD⟩) に置き換えることにより、個人識別情報 (PII) を確実に編集します。 。また、ClamAV を使用してすべてのデータセットをスキャンし、ソース コード内のマルウェアのインスタンスを特定して削除します。モデルのトレーニング用のコード データを収集することに加えて、言語理解と数学的推論におけるモデルの習熟度を向上させるために、公開されている高品質の自然言語データセットをいくつか厳選しています。
Granite コード ベースモデルは、コード データとコードに関連する自然言語データセットの 3 ~ 4T トークンでトレーニングされます。データは、StarCoder と同じトークナイザーを使用して、バイト ペア エンコーディング (BPE) によってトークン化されます。次の 2 段階のトレーニングで高品質のデータを利用します。
Granite Code Instruct モデルは、次の種類の命令データに基づいて微調整されています: 1) CommitPackFT から取得したコード コミット、2) 高品質の数学データセット、具体的には MathInstruct と MetaMathQA を使用、3) Glaive-Code-Assistant などのコード命令データセットv3、Self-OSS-Instruct-SC2、Glaive-Function-Calling-v2、NL2SQL11、および合成 API 呼び出しの小さなコレクションデータセット、4) HelpSteer や Platypus のオープン ライセンス フィルタリング バージョンなどの高品質の言語指導データセット。
当社では、HumanEvalPack、MBPP、MBPP+ を含む (ただしこれらに限定されない) ベンチマークの包括的なリストに基づいて、コード モデルの広範な評価を実施しています。この一連のベンチマークには、一般的に使用されるプログラミング言語 (Python、JavaScript、Java、Go、C++、Rust など) にわたるさまざまなコーディング タスクが含まれます。
私たちの調査結果では、Granite コード モデルがモデル サイズ全体にわたって強力なオープン ソース モデルよりも優れていることが明らかになりました。以下の図は、 Granite-8B-Code-Base
3 つのコーディング タスクにおいてMistral-7B
、 LLama-3-8B
、およびその他のオープン ソース モデルよりも優れていることを示しています。さらなる評価結果を論文で提供します。
モデルのいずれかを使用するには、次から適切なmodel_path
を選択します。
ibm-granite/granite-3b-code-base-2k
ibm-granite/granite-3b-code-instruct-2k
ibm-granite/granite-8b-code-base-4k
ibm-granite/granite-8b-code-instruct-4k
ibm-granite/granite-20b-code-base-8k
ibm-granite/granite-20b-code-instruct-8k
ibm-granite/granite-34b-code-base-8k
ibm-granite/granite-34b-code-instruct-8k
from transformers import AutoModelForCausalLM , AutoTokenizer
device = "cuda" # or "cpu"
model_path = "ibm-granite/granite-3b-code-base-2k" # pick anyone from above list
tokenizer = AutoTokenizer . from_pretrained ( model_path )
# drop device_map if running on CPU
model = AutoModelForCausalLM . from_pretrained ( model_path , device_map = device )
model . eval ()
# change input text as desired
input_text = "def generate():"
# tokenize the text
input_tokens = tokenizer ( input_text , return_tensors = "pt" )
# transfer tokenized inputs to the device
for i in input_tokens :
input_tokens [ i ] = input_tokens [ i ]. to ( device )
# generate output tokens
output = model . generate ( ** input_tokens )
# decode output tokens into text
output = tokenizer . batch_decode ( output )
# loop over the batch to print, in this example the batch size is 1
for i in output :
print ( i )
すべてのモデルの微調整 (または命令チューニング) に Dolomite エンジンを使用しています。 ibm-granite/granite-3b-code-base
微調整するためのサンプル スクリプトを提供します。モデルを微調整するには、次の手順に従います。
git clone https://github.com/IBM/dolomite-engine/
cd dolomite-engine
# you might need to modify configs/granite-example/training.yml
sh scripts/finetune.sh configs/granite-example/training.yml
# once the model is trained, convert to HuggingFace-compatible safetensors
sh scripts/export.sh configs/granite-example/export.yml
ヒント
パディングフリーのトランスフォーマーを使用してトレーニング中にメモリ フットプリントと FLOP を節約したい場合は、Dolomite Engine README の指示に従って詳細を確認してください。
私たちのプロジェクトに貢献するには、ガイドラインと行動規範を確認してください。
各モデル バリアントのモデル カードは、それぞれの HuggingFace リポジトリで入手できます。こちらから私たちのコレクションをご覧ください。
選択したモデル (この例では granite-3b-code-base) は、以下を使用して複製できます。
git clone https://huggingface.co/ibm-granite/granite-3b-code-base-2k
すべての Granite コード モデルは、Apache 2.0 ライセンスに基づいて配布されます。
私たちのコレクションにアクセスして、コード モデル ファミリに関するご意見をお聞かせください。フィードバックを提供したいモデルのリポジトリを選択します。次に、 [コミュニティ]タブに移動し、 [新しいディスカッション]をクリックします。あるいは、github ディスカッション ページに質問やコメントを投稿することもできます。