コード生成アプリケーション

コード生成 (CodeGen) 大規模言語モデル (LLM) は、演算コードの生成に特化して設計された、専用の AI モデルです。このタイプのモデルは、リポジトリー、専門的なドキュメント、プログラミング・コード、ウェブコンテンツといった関連性の高いデータセットによる学習処理を経て、さまざまなプログラミング言語、コーディング・パターン、ソフトウェア開発のコンセプトを深く理解します。コード生成 LLM は、開発者やプログラマーの作業を補完するために設計されました。このような LLM を開発者の統合開発環境 (IDE) へシームレスに一体化すれば、コメント、関数名、変数名などの多様なエレメントを含め、モデルがコードのコンテキスト全体を理解し、このコンテキスト認識によって、さらに精巧なコンテキストに基づいた関連性の高いコーディングの提示が可能になります。
コード生成 LLM の用途として、次のような機能が挙げられます。

• コード生成: コード生成によるコーディングの効率化。プログラマーではなくても、コード記述のタスクが可能になります。
• コードの完成: 開発者の入力に応じてコンテキストに一致したスニペットを提案することで、コーディングを短時間で完了。
• コードの変換とモダナイズ: 複数のプログラミング言語間でコードを変換 / モダナイズ。相互運用性の向上に加えて、従来型プロジェクトのアップデートが可能になります。
• コードの要約: コードベースから主要インサイトを抽出。読みやすさと開発者の生産性向上につながります。
• コード・リファクタリング: コードのパフォーマンスや効率性を向上するためのコード・リファクタリングを提案。
• AI アシストのテスト実施: テストケースの作成、コードの安定性を強化、開発サイクルを短縮。
• エラー検出とデバッグ: コード内のエラーを検出し、詳細な説明と修正案を提示することで、デバッグ工程をスピードアップ。

ここでは Code Copilot アプリケーションを例に、インテル® Gaudi® 2 アクセラレーターまたはインテル® Xeon® プロセッサー搭載プラットフォームを使用したコード生成の実装方法を説明します。この CodeGen のユースケースは、m-a-p/OpenCodeInterpreter-DS-6.7B や deepseek-ai/deepseek-coder-33b-instruct といったオープンソース・モデルとテキスト生成推論 (TGI) を活用してサービスを実装するコード生成です。
ワークフローは以下のようなアーキテクチャーに分類されます。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/d7e00477-845d-4f97-a18c-8b109dce92b9.png)

こちらは GenAIComps で定義されているコンポーネント・レベルのマイクロサービスを使用して実装した CodeGen の例です。以下のフローチャートは、この実装例でのマイクロサービス間の情報の流れを示しています。
https://github.com/opea-project/GenAIComps

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/89c689ab-9cd6-4da4-a261-e11f8318af1f.png)

＜CodeGen サービスの実装＞
CodeGen サービスはインテル® Gaudi® 2 アクセラレーターまたはインテル® Xeon® スケーラブル・プロセッサーのどちらでも簡単に実装することができます。
現在サポートしているのは Docker Compose を使用したサービスの 2 つの実装方法です。
1. docker hub 上で Docker イメージを使用してサービスを開始:
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/f745aec2-f639-4206-84eb-d683f3b24d83.png)

2. ソースからビルドした Docker イメージを使用してサービスを開始。詳しくは、インテル® Gaudi® アクセラレーターのガイドまたはインテル® Xeon® プロセッサーのガイドを参照してください。
https://github.com/opea-project/GenAIExamples/blob/main/CodeGen/docker_compose/intel/hpu/gaudi/README.md
https://github.com/opea-project/GenAIExamples/blob/main/CodeGen/docker_compose/intel/cpu/xeon/README.md

【必要なモデル】
LLM モデルは以下のデフォルト値に設定されています。

サービス　LLM_MODEL_ID
モデル　Qwen/Qwen2.5-Coder-7B-Instruct
https://huggingface.co/Qwen/Qwen2.5-Coder-7B-Instruct

Qwen/Qwen2.5-Coder-7B-Instruct は Hugging Face 経由でアクセスリクエストのサブミットが必要なゲート付きモデルです。ほかのモデルに置き換えることもできます。必要に応じて、以下の LLM_MODEL_ID を例えば次のように変更してください: deepseek-ai/deepseek-coder-6.7b-instruct
https://huggingface.co/deepseek-ai/deepseek-coder-6.7b-instruct

LLM モデルとして meta-llama/CodeLlama-7b-hf を選択した場合は、こちらにアクセスして Expand to review and access ボタンをクリックし、モデルへのアクセスを要求する必要があります。
https://huggingface.co/meta-llama/CodeLlama-7b-hf

＜環境変数の設定＞
CodeGen サービスを実装するための環境変数の設定は、以下の手順で行います。
1.	必要な環境変数を設定する
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/513758e3-6386-4403-8144-688be66db38b.png)

2.	プロキシー環境の場合は、プロキシー関連の環境変数も設定する
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/8a27c2e0-3cfa-4fee-8a16-6d9277b55683.png)

3.	その他の環境変数を設定する
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/c8aa1ec7-0cf3-4155-beb5-22f57e42fa8b.png)

＜Docker を使用した CodeGen の実装＞
【CodeGen のインテル® Gaudi® アクセラレーターへの実装】
該当の compose.yaml を検索します。
https://github.com/opea-project/GenAIExamples/blob/main/CodeGen/docker_compose/intel/hpu/gaudi/compose.yaml

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/797be6be-9f09-4f7d-863d-3f4efb26ddac.png)

ソースから Docker イメージをビルドする方法については、インテル® Gaudi® アクセラレーターのガイドを参照してください。
https://github.com/opea-project/GenAIExamples/blob/main/CodeGen/docker_compose/intel/hpu/gaudi/README.md

【CodeGen のインテル® Xeon® プロセッサーへの実装】
該当の compose.yaml を検索します。
https://github.com/opea-project/GenAIExamples/blob/main/CodeGen/docker_compose/intel/cpu/xeon/compose.yaml

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/ba795cfe-a791-47fd-9a03-1eb3c459ab9a.png)

ソースから Docker イメージをビルドする詳しい手順については、インテル® Xeon® プロセッサーのガイドを参照してください。
https://github.com/opea-project/GenAIExamples/blob/main/CodeGen/docker_compose/intel/cpu/xeon/README.md

【Kubernetes を使用した CodeGen の実装】
Kubernetes を使用して CodeGen をインテル® Xeon® プロセッサー / インテル® Gaudi® アクセラレーターに実装する手順については、Kubernetes のガイドを参照してください。
https://github.com/opea-project/GenAIExamples/blob/main/CodeGen/kubernetes/intel/README.md

【Helm Chart を使用し CodeGen を Kubernetes に実装】
まずは Helm (v3.15 以降) をインストールします。詳しくは、Helm インストール・ガイドを参照してください。
https://helm.sh/docs/intro/install/

Kubernetes を使用して CodeGen をインテル® Xeon® プロセッサー / インテル® Gaudi® アクセラレーターに実装する手順については、CodeGen helm chart を参照してください。
https://github.com/opea-project/GenAIInfra/blob/main/helm-charts/codegen/README.md

＜CodeGen サービスの利用＞
2 パターンの CodeGen サービス利用方法:

1.	Terminal で cURL コマンドを実行する
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/8d2fc0fc-b31a-4706-96ce-d93fe95c59e0.png)

2.	フロントエンド経由でアクセスする
フロントエンドにアクセスするには、ブラウザーで以下の URL を開放します。
http://{host_ip}:5173
デフォルトの場合 UI は内部的にポート 5173 で起動します。

＜トラブルシューティング＞
1.「アクセスが拒否されました」といったエラーが表示される場合、まずはマイクロサービスを確認してください。簡単な例を示します。
https://github.com/opea-project/GenAIExamples/blob/main/CodeGen/docker_compose/intel/cpu/xeon/README.md#validate-microservices
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/90ad9b77-b18c-4d8f-92d1-20a66f967a3a.png)

2.このようなエラー "aiohttp.client_exceptions.ClientConnectorError: Cannot connect to host xx.xx.xx.xx:8028" が表示された場合は、tgi service を確認します。「URL https://huggingface.co/meta-llama/CodeLlama-7b-hf/resolve/main/config.json のゲート付きリポジトリーにアクセスできない」といった tgi service エラーになる場合、まずはモデルへのアクセスを求める必要があります。詳しい手順については、必要なモデルのセクションで説明した設定を参照してください。
https://github.com/opea-project/GenAIExamples/blob/main/CodeGen/README.md#required-models

3.(Docker のみ) すべてのマイクロサービスが問題なく起動している場合、ポート ${host_ip}:7778 を確認。ポートがほかのユーザーによって割り当てられていることもあるため、compose.yaml を修正します。

4.(Docker のみ) 「指定されたコンテナ名は使用中です」などのエラーが表示される場合は、compose.yaml 内のコンテナ名を変更。