CodeGemmaの完全解説:Google製コード生成AI

AIコード生成

こんにちは!今回は、Googleが開発した最先端のコード生成AI「CodeGemma」について、初心者の方でも完璧に理解できるよう、詳細に解説していきます。CodeGemmaは、コード補完やコード生成に特化した大規模言語モデル(LLM)であり、開発者の生産性向上に大きく貢献することが期待されています。

CodeGemmaの概要

定義と特徴

CodeGemmaは、Googleが開発したコード生成に特化した大規模言語モデル(LLM)です。Gemmaをベースに、さらに5,000億トークンもの公開コードリポジトリ、オープンソースの数学データセット、合成コードを追加学習することで、コード補完やコード生成のタスクに特化したモデルになっています。

入力と出力

  • 入力:
    • 事前学習済みモデル:コード補完や生成シナリオのためのコードの接頭辞や接尾辞、自然言語のテキストやプロンプト
    • 命令学習済みモデル:自然言語のテキストやプロンプト
  • 出力:
    • 事前学習済みモデル:fill-in-the-middleコード補完、コード、自然言語
    • 命令学習済みモデル:コード、自然言語

モデルのバリエーション

CodeGemmaには、以下の3つのバリエーションがあります。

  • codegemma-2b: 20億のパラメータを持つ、高速なコード補完に特化したモデル
  • codegemma-7b: 70億のパラメータを持つ、コード補完とコード生成に特化したモデル
  • codegemma-7b-it: 70億のパラメータを持つ、コードチャットと命令実行に特化したモデル

    モデル コード補完 自然言語からの生成 チャット 命令実行
    codegemma-2b
    codegemma-7b
    codegemma-7b-it

コード補完の使い方

CodeGemmaのコード補完機能は、コードエディタ内で使用できます。以下のトークンを使って、補完したい部分を指定します。

  • <|fim_prefix|>: 補完前のコンテキストを指定
  • <|fim_suffix|>: 補完後のコンテキストを指定(カーソルの位置に相当)
  • <|fim_middle|>: モデルに補完を指示するプロンプト
  • <|file_separator|>: 複数ファイルのコンテキストを提供する際に使用

    以下は、Pythonでの使用例です。

    from transformers import GemmaTokenizer, AutoModelForCausalLM
    
    model_id = "google/codegemma-7b"
    tokenizer = GemmaTokenizer.from_pretrained(model_id)
    model = AutoModelForCausalLM.from_pretrained(model_id)
    
    prompt = '''\
    <|fim_prefix|>import datetime
    def calculate_age(birth_year):
       """Calculates a person's age based on their birth year."""
       current_year = datetime.date.today().year
       <|fim_suffix|>
       return age<|fim_middle|>\
    '''
    
    inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
    prompt_len = inputs["input_ids"].shape[-1]
    outputs = model.generate(**inputs, max_new_tokens=100)
    print(tokenizer.decode(outputs[0][prompt_len:]))

    生成された出力から、不要な部分を取り除くために、以下のようにターミネータを指定することをおすすめします。

    FIM_PREFIX = '<|fim_prefix|>'
    FIM_SUFFIX = '<|fim_suffix|>'
    FIM_MIDDLE = '<|fim_middle|>'
    FIM_FILE_SEPARATOR = '<|file_separator|>'
    
    terminators = tokenizer.convert_tokens_to_ids([FIM_PREFIX, FIM_MIDDLE, FIM_SUFFIX, FIM_FILE_SEPARATOR])
    terminators += [tokenizer.eos_token_id]
    
    outputs = model.generate(
     **inputs,
     max_new_tokens=100,
     eos_token_id=terminators,
    )

コード生成の使い方

CodeGemmaを使ってコードを生成するには、以下のようにします。

   from transformers import GemmaTokenizer, AutoModelForCausalLM

   tokenizer = GemmaTokenizer.from_pretrained("google/codegemma-7b")
   model = AutoModelForCausalLM.from_pretrained("google/codegemma-7b")

   input_text = "Write me a Python function to calculate the nth fibonacci number."
   input_ids = tokenizer(input_text, return_tensors="pt")

   outputs = model.generate(**input_ids)
   print(tokenizer.decode(outputs[0]))

モデルの学習データと処理

CodeGemmaは、Gemmaをベースモデルとして使用し、さらに以下のデータを追加学習しています。

  • 公開コードリポジトリ、オープンソースの数学データセット、合成コードから収集された約5,000億トークンの主に英語のデータ

    学習データには、以下の前処理技術が適用されています。

  • Fill-in-the-Middle(FIM):モデルがFIMタスクに特化するように学習

  • 依存関係グラフベースのパッキングとユニットテストベースの字句パッキング:関連するソースファイルを共同で配置

  • 新しい手法でドキュメントを接頭辞、中間、接尾辞に分割し、接尾辞がより自然な構文点から始まるようにする

  • 個人データ、CSAM、コンテンツの質と安全性に基づくフィルタリングなどの厳格な安全性フィルタリングを適用

実装情報

CodeGemmaの学習には、以下のハードウェアとソフトウェアが使用されました。

  • ハードウェア:最新世代のTensor Processing Unit(TPU)ハードウェア(TPUv5e)
  • ソフトウェア:JAXとML Pathways

評価方法と結果

CodeGemmaは、様々な分野の学術的ベンチマークで評価されています。

  • コード補完ベンチマーク:HumanEval Single Line、Multiple Line Infilling
  • コード生成ベンチマーク:HumanEval、MBPP、BabelCode(C++、C#、Go、Java、JavaScript、Kotlin、Python、Rust)
  • Q&A:BoolQ、PIQA、TriviaQA
  • 自然言語:ARC-Challenge、HellaSwag、MMLU、WinoGrande
  • 数学的推論:GSM8K、MATH

    詳細な評価結果は、モデルカードを参照してください。

倫理的考慮事項とリスク

大規模言語モデル(LLM)の開発には、いくつかの倫理的な懸念があります。CodeGemmaの開発では、これらの側面を慎重に検討しています。

  • 関連するコンテンツポリシーの構造化評価と内部レッドチームテスト
  • 子どもの安全、コンテンツの安全性、表現の害、記憶化、大規模な害などのカテゴリーに対する評価

    詳細は、Gemmaモデルカードを参照してください。

使用目的と既知の制限事項

CodeGemmaモデルには、ユーザーが認識しておくべき制限事項があります。

  • 使用目的:コード補完、コード生成、コード会話、コード教育など
  • 既知の制限事項:学習データと技術の固有の制限に基づく制限事項あり

利点

CodeGemmaは、同じサイズの他のオープンモデルと比較して、優れたパフォーマンスを提供する、責任あるAI開発のために一から設計されたコード中心の大規模言語モデルです。

以上が、CodeGemmaの完全解説です。初心者の方も、この記事を参考に、CodeGemmaの特徴や使い方を理解し、活用していただければ幸いです。コード生成やコード補完に特化したCodeGemmaを使って、開発者の生産性を向上させましょう!

参考サイト

google/codegemma-7b · Hugging Face
We’re on a journey to advance and democratize artificial intelligence through open source and open science.
《JP》AIMO CodeGemma baseline
Explore and run machine learning code with Kaggle Notebooks | Using data from multiple data sources

コメント

タイトルとURLをコピーしました