☰
CodeGeeX2 実践ガイド: 多言語コード生成モデルの推論・量子化・評価・デプロイ
2026/9/29 12:04:19 网站建设 项目流程
  • 大模型
  • 代码模型
  • 基础模型

【免费下载链接】CodeGeeX2

CodeGeeX2: A More Powerful Multilingual Code Generation Model

项目地址:https://gitcode.com/zai-org/CodeGeeX2
点击查看免费下载

CodeGeeX2 は、智谱 AI が公開する多言語コード生成モデル CodeGeeX の第 2 世代であり、わずか 6B パラメータで従来モデルを大きく上回るコーディング性能を持ちます。本記事では、transformers による最短起動から、INT4 量子化・マルチ GPU・Mac・fastllm・ChatGLM.cpp といった多彩な推論方式、HumanEval 系ベンチマークの再現方法、Gradio DEMO と FastAPI によるデプロイまで、本リポジトリの実装(evaluation/utils.py、demo/run_demo.py、scripts/run_humanevalx.sh など)を裏付けとして体系的に解説します。読了後には、CodeGeeX2-6B を自身の環境に合わせて起動・高速化・評価・サービス化するための実戦的な手順をすべて身につけることができます。

モデル概要: CodeGeeX の第 2 世代、ChatGLM2 アーキテクチャに基づく

CodeGeeX2 は、多言語コード生成モデル CodeGeeX)には、以下の特徴が明記されています。

  • より強力なコーディング機能: CodeGeeX2-6B は ChatGLM2-6B をベースに、さらに600B のコードトークンに対して事前学習を行っており、第 1 世代と比較してコーディング能力が総合的に向上。HumanEval-X ベンチマークでは 6 言語すべてで大幅な改善(Python +57%、C++ +71%、Java +54%、JavaScript +83%、Go +56%、Rust +321%)を達成し、Python では Pass@1 一回合格率35.9%に達して StarCoder-15B を上回りました。
  • その他の便利な機能: 中国語と英語のプロンプト、最大8192 シーケンス長をサポート。推論速度は第 1 世代と比較して大幅に改善されており、量子化後は推論に必要な GPU メモリが6GB のみとなり、軽量なローカル展開が可能です。
  • 包括的な AI コーディングアシスタント: CodeGeeX プラグイン(VS Code / JetBrains)のバックエンドがアップグレードされ、100 以上のプログラミング言語をサポート。インフィルやクロスファイル補完などの実用的な機能に加え、対話型 AI コーディングアシスタント「Ask CodeGeeX」を通じて、コードの要約・翻訳・デバッグ・コメント生成などを中国語または英語の対話で解決できます。
  • オープンライセンス: モデルウェイトは学術研究向けに全面的に公開。商用利用は登録フォームからの申請が必要です(詳細は「ライセンス」節を参照)。

なお、本リポジトリはコード・評価・デモ一式を Apache-2.0 ライセンスで公開しており、モデルウェイトは MODEL_LICENSE に従います。

クイックスタート: transformers で CodeGeeX2-6B を動かす

まずリポジトリをクローンし、依存パッケージをインストールします。

git clone https://gitcode.com/zai-org/CodeGeeX2 cd CodeGeeX2 pip install -r requirements.txt

requirements.txt の内容に含まれる主な依存はtransformers>=4.30.2、accelerate、cpm_kernels、torch>=2.0、sentencepiece、gradioなどです。次に、transformersを使って CodeGeeX2-6B を最短で起動します(初回は自動的にウェイトがローカルへダウンロードされます)。

from transformers import AutoTokenizer, AutoModel tokenizer = AutoTokenizer.from_pretrained("THUDM/codegeex2-6b", trust_remote_code=True) model = AutoModel.from_pretrained("THUDM/codegeex2-6b", trust_remote_code=True, device='cuda') model = model.eval() # remember adding a language tag for better performance prompt = "# language: Python\n# write a bubble sort function\n" inputs = tokenizer.encode(prompt, return_tensors="pt").to(model.device) outputs = model.generate(inputs, max_length=256, top_k=1) response = tokenizer.decode(outputs[0])

実行結果の例(README 記載の出力そのまま):

>>> print(response) # language: Python # write a bubble sort function def bubble_sort(list): for i in range(len(list) - 1): for j in range(len(list) - 1): if list[j] > list[j + 1]: list[j], list[j + 1] = list[j + 1], list[j] return list print(bubble_sort([5, 2, 1, 8, 4]))

ウェイトをあらかじめ手動でダウンロードし、ローカルパスから読み込むこともできます。

model_path = "/path/to/codegeex2-6b" tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True) model = AutoModel.from_pretrained(model_path, trust_remote_code=True)

使用上の注意点

  • CodeGeeX2 はベースモデルです。チャット用の命令チューニングは行われていないため、コード補完・翻訳・説明のようなタスクには対応しますが、対話用途には対応していません。命令チューニング済みの体験は CodeGeeX プラグイン(VS Code / JetBrains)で行えます。この点は demo/run_demo.py 内の注意書きにも明記されています。
  • 生成するプログラミング言語は、# language: Pythonのようなlanguage tagをプロンプト先頭に追加することで制御できます。パフォーマンスを確保するため、書式(言語に応じたコメント形式)は厳守してください。
  • 複数グラフィックカードでモデルをロードする必要がある場合、demo/gpus.py のload_model_on_gpusを使用します(後述の「マルチ GPU 推論」参照)。
def get_model(): tokenizer = AutoTokenizer.from_pretrained("THUDM/codegeex2-6b", trust_remote_code=True) from gpus import load_model_on_gpus model = load_model_on_gpus("THUDM/codegeex2-6b", num_gpus=2) model = model.eval() return tokenizer, model tokenizer, model = get_model()

Gradio DEMO の起動

対話形式のデモは次の 1 コマンドで起動できます。

python ./demo/run_demo.py

デフォルトでは127.0.0.1:7860で Gradio サーバが立ち上がり、demo/example_inputs.jsonl に定義されたクイックソート、バイナリサーチ、SQL、Golang の並行ファイルシステムなどのサンプル入力をワンクリックで挿入して試せます。

プロンプト設計: 言語タグで生成言語を制御

CodeGeeX2 は約 100 言語に対応しており、完全な言語リストは evaluation/utils.py のLANGUAGE_TAG辞書で確認できます。これは評価・デモ・API で共通して使われる設計です。抜粋すると以下のようになります。

LANGUAGE_TAG = { "c" : "// language: C", "c++" : "// language: C++", "python" : "# language: Python", "javascript" : "// language: JavaScript", "go" : "// language: Go", "rust" : "// language: Rust", "sql" : "-- language: SQL", "html" : "<!--language: HTML-->", "matlab" : f"% language: Matlab", ... }

言語ごとにコメント記号が異なるため、「その言語のコメント形式で」タグを記述することが品質確保のポイントです。たとえば Python は#、C 系言語は//、HTML は<!-- -->、SQL は--を使います。より良い結果を得るには、選択した言語のフォーマットでプロンプト本文のコメントも書いてください。同じ辞書は demo/run_demo.py や demo/fastapicpu.py にもあり、Gradio の言語ラジオボタンの選択肢や FastAPI のlangパラメータの値として利用されています。

評価: HumanEval / HumanEval-X / DS1000

CodeGeeX2 は多言語コード生成のベースモデルとして、前世代と比較してコーディング能力が大幅に向上しています。以下に HumanEval、HumanEval-X、DS1000 ベンチマークでの評価結果を示します(評価指標 Pass@k は論文と同じ定義です)。

HumanEval (Pass@1,10,100)

ModelPass@1Pass@10Pass@100
CodeGen-16B-multi19.234.655.2
CodeGeeX-13B22.939.660.9
Codex-12B28.846.872.3
CodeT5Plus-16B-mono30.951.676.7
Code-Cushman-00133.554.377.4
LLaMA-65B23.7-79.3
LLaMA2-70B29.9--
CodeGen2.5-7B-mono33.458.482.7
StarCoder-15B33.261.084.7
CodeGeeX2-6B35.962.688.3

Pass@1はn=20, t=0.2, top_p=0.95、Pass@10 および Pass@100はn=200, t=0.8, top_p=0.95で算出。

HumanEval-X (Pass@1)

ModelPythonC++JavaJavaScriptGoRustOverall
CodeGen-16B-multi19.218.115.018.413.01.814.2
CodeGeeX-13B22.917.120.017.614.44.316.0
Replit-code-v1-3B22.020.120.120.112.28.617.2
CodeGen2.5-7B-multi30.624.329.027.518.920.125.1
StarCoder-15B35.528.231.533.221.317.827.9
CodeGeeX2-6B35.929.330.832.222.518.128.1

Pass@1はn=20, t=0.2, top_p=0.95で算出。実験環境は HumanEval-X の公式セットアップに準拠します。

DS1000 (Pass@1)

ModelMatplotlibNumpyPandasPytorchSciPyScikit-learnTensorFlowOverall
# Samples15522029168106115451000
CodeGen-16B-Mono31.710.93.47.09.010.815.211.7
code-cushman-00140.721.87.912.411.318.012.218.1
Codex-00141.826.69.49.715.018.517.220.2
CodeGeeX2-6B40.525.514.517.319.324.023.023.1
StarCoder-15B51.729.711.421.420.229.524.526.0
Codex-00257.043.126.541.831.844.839.339.2

Pass@1はn=40, t=0.2, top_p=0.5で算出。

評価結果の再現方法

HumanEval-X の上記結果は、scripts/run_humanevalx.sh を実行することで再現できます。このスクリプトはMODE環境変数で動作を切り替えます。

MODE=gen bash ./scripts/run_humanevalx.sh # 生成のみ MODE=eval bash ./scripts/run_humanevalx.sh # 評価のみ MODE=both bash ./scripts/run_humanevalx.sh # 生成+評価(デフォルト)

スクリプト内の主要な設定項目は以下の通りです(scripts/run_humanevalx.sh)。

設定値説明
MODEL_PATH/pathto/codegeex2-6b/モデルのローカルパス
DATASEThumanevalxデータセット種別
LANGUAGEpython java js cpp go rust6 言語をループ評価
TIMEOUT5(Rust は300)各テストの実行タイムアウト(秒)
NUM_SAMPLES1/20/200問題あたりのサンプル数
TEMP1.0/0.2/0.8サンプリング温度
TOPK/TOPP1/1.0などtop-k / top-p
MAX_LENGTH1024生成最大トークン長
SEED42乱数シード

スクリプトには Pass@1 のグリーディ(greedy)版、Pass@1 推定版(n=20, t=0.2, top_p=0.95)、Pass@10 / Pass@100 版(n=200, t=0.8, top_p=0.95)の 3 セットがコメント付きで用意されており、目的に応じてコメントアウトを切り替えます。生成フェーズは evaluation/generation.py、実行評価は evaluation/evaluation.py、結果の集計は evaluation/inspect_jsonl.py が担当し、result-*.jsonlが benchmark/humanevalx 配下のhumanevalx_{lang}.jsonl.gzデータを元に生成・検査されます。

また、Pass@k の推定ロジックそのものは evaluation/utils.py のestimate_pass_at_kに実装されており、1 - comb(n-c, k) / comb(n, k)を効率的に計算します。言語ごとのテスト組み立て(import 補助やmain関数の扱い)も同ファイルのIMPORT_HELPERと evaluation/evaluation.py のprocess_testで行われており、評価コード全体の再現性設計を確認できます。

推論性能と量子化

CodeGeeX2 は前世代よりも導入が容易になっています。マルチクエリーアテンション(MQA)とフラッシュアテンションの採用により推論速度が向上し、INT4 量子化後は必要な GPU メモリが 6GB のみです。

量子化によるメモリ使用量

ModelFP16/BF16INT8INT4
CodeGeeX-13B26.9 GB14.7 GB-
CodeGeeX2-6B13.1 GB8.2 GB5.5 GB

PyTorch 2.0 ベースで、torch.nn.functional.scaled_dot_product_attentionを使用した効率的なアテンションメカニズムを実現。

推論速度の比較

Model推論速度 (token/秒)
CodeGeeX-13B32
CodeGeeX2-6B94

batch_size=1, max_length=2048、いずれもアクセラレーションフレームワーク使用、GeForce RTX-3090での計測。

多精度・量子化推論の実践

CodeGeeX2 は BF16 で学習されており、推論時はBF16 / FP16 / INT8 / INT4のいずれの精度でも動作します。GPU の VRAM 容量に応じて精度を選択してください。

  • デフォルトは BF16 精度での推論です。GPU が BF16 に対応していない場合、誤った形式のまま推論すると出力が乱れます(文字化け)ので、必ず FP16 に変換してください。
  • FP16 への変換は.half()を使います:
model = AutoModel.from_pretrained(model_path, trust_remote_code=True).half().to("cuda")
  • INT4 量子化推論は、変換済みウェイト(THUDM/codegeex2-6b-int4)を直接読み込むか、.quantize(4)で手動変換します。GPU が BF16 非対応の場合は、先に FP16 へ変換してから量子化します:
# 変換済みウェイトをダウンロードして使用 model = AutoModel.from_pretrained("THUDM/codegeex2-6b-int4", trust_remote_code=True) # 手動変換 model = AutoModel.from_pretrained("THUDM/codegeex2-6b", trust_remote_code=True).quantize(4).to("cuda") # GPU が BF16 非対応の場合は FP16 に変換してから量子化 model = AutoModel.from_pretrained("THUDM/codegeex2-6b", trust_remote_code=True).half().quantize(4).to("cuda")

demo/run_demo.py の実装を見ると、--quantize 4|8を渡すとmodel.half().quantize(args.quantize)で INT4/INT8 量子化が適用されることが確認できます。INT4 なら 5.5GB、INT8 なら 8.2GB という軽量な VRAM 消費でローカル展開が可能です。

マルチ GPU 推論

VRAM が足りない場合や複数 GPU を使いたい場合は、demo/gpus.py のload_model_on_gpusを使用します。

from gpus import load_model_on_gpus model = load_model_on_gpus("THUDM/codegeex2-6b", num_gpus=2)

内部のauto_configure_device_map(demo/gpus.py)は、ChatGLM2 / CodeGeeX2 の 30 層構造(transformer.embedding.word_embeddings、final_layernorm、output_layer、rotary_pos_emb、lm_headの 5 コンポーネント + 28 層のtransformer.encoder.layers)を複数 GPU へ自動的に分散配置します。embedding とlm_headを最初の GPU に固定するのは、Linux 上でtorch.embeddingの weight と input が異なるデバイスに載ると RuntimeError になる問題への対策です。num_gpus < 2の場合は通常どおり.half().cuda()で単一 GPU にロードされます。なお、この多 GPU 読み込みはaccelerateのdispatch_modelベースで実装されています。

Mac(Apple Silicon)での推論

Apple Silicon または AMD GPU 搭載の Mac では、MPS バックエンドで推論できます。まず PyTorch-Nightly(バージョンは2.x.x.dev2023xxxx形式、例:2.1.0.dev20230729)をインストールします。

pip3 install --pre torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/nightly/cpu

MacOS 上ではローカルからのモデル読み込みのみサポートされます(codegeex2-6b/codegeex2-6b-int4を事前にダウンロード)。対応精度はFP16 / INT8 / INT4で、MPS デバイスで実行します。

model = AutoModel.from_pretrained(model_path, trust_remote_code=True).half().to('mps')

demo/run_demo.py では CUDA が無い環境でtorch.backends.mps.is_built()を判定して自動的に MPS へフォールバックする実装になっており、Mac でもそのままデモを起動できます。

fastllm による高速推論

fastllm は GLM アーキテクチャをサポートする高速なオープンソース推論フレームワークです。まずfastllm_pytoolsをビルド・インストールします。

git clone https://github.com/ztxz16/fastllm cd fastllm mkdir build cd build # GPU でビルドする場合(CUDA パス設定が必要): # export CUDA_HOME=/usr/local/cuda/bin:$PATH # export PATH=$PATH:$CUDA_HOME/bin cmake .. -DUSE_CUDA=ON # CPU のみなら cmake .. -DUSE_CUDA=OFF make -j cd tools && python setup.py install # python で import fastllm_pytools が成功すれば OK

ビルド時のトラブル対応:

  • アーキテクチャ非対応エラーが発生する場合、CMakeLists.txt内のset(CMAKE_CUDA_ARCHITECTURES "native")をコメントアウトします。
  • E5 系 CPU でコンパイルエラー(error: inlining failed in call to 'always_inline' '__m256i _mm256_add_epi32(...)': target specific option mismatch)が出た場合は、CMakeLists.txtの CXX フラグ行を次のように変更するとコンパイルが通ります:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread --std=c++17 -O2")

次に、Hugging Face モデルを fastllm 形式へ変換します。変換はllm.from_hfの 2 行を追加するだけです。

# 元の呼び出しコード from transformers import AutoTokenizer, AutoModel tokenizer = AutoTokenizer.from_pretrained("THUDM/codegeex2-6b", trust_remote_code=True) model = AutoModel.from_pretrained("THUDM/codegeex2-6b", trust_remote_code=True) # 以下の 2 行を追加して fastllm モデルへ変換 from fastllm_pytools import llm model = llm.from_hf(model, tokenizer, dtype="float16") # dtype は "float16" / "int8" / "int4"

fastllm のモデルインターフェースは Hugging Face と完全には一致しないため、demo/run_demo.py の実装を参考に、direct_queryを有効化してmodel.chat(...)を呼び出します。

model.direct_query = True outputs = model.chat(tokenizer, prompt, max_length=out_seq_length, top_p=top_p, top_k=top_k, temperature=temperature) response = outputs[0]

デモでは--fastllmオプションで有効化でき、--quantize 4|8と組み合わせて INT4 / INT8 に量子化した状態で加速推論できます。

ChatGLM.cpp による量子化加速

ChatGLM.cpp は LLaMA.cpp と同様の全プラットフォーム対応量子化加速ソリューションで、q4_0/q4_1/q5_0/q5_1/q8_0の量子化精度と CPU / CUDA / Metal の各バックエンドをサポートしています。まずインストールします。CUDA 加速を使う場合はCMAKE_ARGS="-DGGML_CUBLAS=ON"を設定し、CPU のみの場合はその環境変数を外します。

CMAKE_ARGS="-DGGML_CUBLAS=ON" pip install chatglm-cpp -v

利用はわずか 1 行で、Hugging Face モデルを読み込みながら指定の精度へ量子化します。dtypeにはq4_0/q4_1/q5_0/q5_1/q8_0/f16を指定できます。

>>> import chatglm_cpp >>> pipeline = chatglm_cpp.Pipeline("THUDM/codegeex2-6b", dtype="q4_0") # HF モデルを読み込み INT4 へ量子化 Loading checkpoint shards: 100%|... 7/7 ... Processing model states: 100%|... 199/199 ... ... >>> print(pipeline.generate("# language: Python\n# write a bubble sort function\n", do_sample=False)) def bubble_sort(list): for i in range(len(list) - 1): for j in range(len(list) - 1): if list[j] > list[j + 1]: list[j], list[j + 1] = list[j + 1], list[j] return list print(bubble_sort([5, 4, 3, 2, 1]))

ChatGLM.cpp は本リポジトリにも統合されており、demo/run_demo.py は--quantize 4 --chatglm-cppを渡すと INT4(q4_0)量子化加速を有効化します。例:

python ./demo/run_demo.py --quantize 4 --chatglm-cpp

FastAPI ベースの demo/fastapicpu.py も同じ引数で ChatGLM.cpp 加速に対応しており、サービスとして起動できます。

python ./demo/fastapicpu.py --quantize 4 --chatglm-cpp

Gradio DEMO と Web API デプロイ

本リポジトリには 2 種類のデプロイ方法が用意されています。

Gradio DEMO(demo/run_demo.py)

python ./demo/run_demo.py

add_code_generation_args で定義された主な起動オプションは以下の通りです。

オプションデフォルト説明
--model-pathTHUDM/codegeex2-6bモデルパス(HF リポジトリ名 or ローカルパス)
--example-pathNoneサンプル入力 JSONL のパス(未指定なら demo/example_inputs.jsonl を自動使用)
--quantizeNone4/8で INT4 / INT8 量子化
--chatglm-cppFalseChatGLM.cpp による量子化加速を有効化
--fastllmFalsefastllm による加速を有効化
--n-gpus1使用する GPU 数(複数 GPU 読み込み)
--gpu0使用する GPU デバイス番号
--cpuFalseCPU 推論へフォールバック
--listen127.0.0.1サーバのバインドアドレス
--port7860サーバのポート
--username/--password/--auth-認証付き起動

Gradio UI では生成パラメータとしてSeed(デフォルト 8888)、Output Sequence Length(最大 8192、デフォルト 128)、Temperature(最大 1、デフォルト 0.2)、Top K(デフォルト 0)、Top P(デフォルト 0.95)をスライダーで調整でき、言語選択ラジオボタンで LANGUAGE_TAG に基づく言語タグを自動付与します。なお、transformers 経路の生成ではpad_token_id=2とeos_token_id=2が明示されており(demo/run_demo.py)、サンプリング時はdo_sample=Trueで temperature / top_p / top_k が適用されます。

FastAPI サービス(demo/fastapicpu.py)

CPU / GPU 問わず HTTP API として公開できます。

python ./demo/fastapicpu.py --quantize 4 --chatglm-cpp

POST /エンドポイントが JSON を受け取り、lang(言語タグ)をプロンプト先頭に自動付与してコードを生成します。リクエストパラメータはlang、prompt、max_length(デフォルト 128)、top_p(0.95)、temperature(0.2)、top_k(0)です。テスト例:

curl -X POST "http://127.0.0.1:7860" \ -H 'Content-Type: application/json' \ -d '{"lang": "Python", "prompt": "# Write a bubble sort function", "max_length": 512}'

レスポンスはresponse/lang/status/timeを含む JSON で返却され、uvicorn の--workersで並列ワーカー数も調整できます。CPU 推論は--cpu、FP16 は--halfで制御できます。

ライセンス

  • 本リポジトリのコードは Apache-2.0 ライセンス の下でオープンソース公開されています。
  • モデルウェイトは Model License に基づきライセンスされています。CodeGeeX2-6B のウェイトは学術研究用に公開されており、商用利用を希望する場合は登録フォーム(mcode=CodeGeeX2-6B)に記入して申請が必要です。
  • 商用・軍事・不正目的での利用や、国家安全・公共の利益・人権を損なう利用は禁止されています(MODEL_LICENSE 第 3 条)。

引用

本研究が役に立った場合は、以下の論文を引用してください。

@inproceedings{zheng2023codegeex, title={CodeGeeX: A Pre-Trained Model for Code Generation with Multilingual Benchmarking on HumanEval-X}, author={Qinkai Zheng and Xiao Xia and Xu Zou and Yuxiao Dong and Shan Wang and Yufei Xue and Zihan Wang and Lei Shen and Andi Wang and Yang Li and Teng Su and Zhilin Yang and Jie Tang}, booktitle={Proceedings of the 29th ACM SIGKDD Conference on Knowledge Discovery and Data Mining}, pages={5673--5684}, year={2023} }

関連リソース

  • 推論チュートリアル(中国語): docs/zh/inference_zh.md — CPU・多精度量子化・多 GPU・Mac・fastllm・ChatGLM.cpp の詳細手順が網羅されています
  • 評価パイプライン: evaluation/generation.py / evaluation/evaluation.py / evaluation/inspect_jsonl.py
  • ベンチマークデータ: benchmark/humanevalx(Python / C++ / Java / JavaScript / Go / Rust の JSONL)
  • デモ用サンプル入力: demo/example_inputs.jsonl
  • 大模型
  • 代码模型
  • 基础模型

【免费下载链接】CodeGeeX2

CodeGeeX2: A More Powerful Multilingual Code Generation Model

项目地址:https://gitcode.com/zai-org/CodeGeeX2
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询