「GLM-4.5-Air」を試す
GitHubレポジトリ
o4-miniによる翻訳
GLM-4.5
モデル紹介
GLM-4.5 シリーズモデルは、インテリジェントエージェント向けに設計された基盤モデルです。GLM-4.5 は総パラメータ数 355 billion、アクティブパラメータ数 32 billion、一方 GLM-4.5-Air はよりコンパクトな設計で総パラメータ数 106 billion、アクティブパラメータ数 12 billion を採用しています。GLM-4.5 モデルは、推論、コーディング、およびインテリジェントエージェント機能を統合し、複雑なエージェントアプリケーションの要求を満たします。
GLM-4.5 と GLM-4.5-Air はハイブリッド推論モデルで、複雑な推論とツール利用のためのthinkingモードと、即時応答のためのnon-thinkingモードの2つのモードを提供します。
基盤モデル、ハイブリッド推論モデル、およびハイブリッド推論モデルの FP8 バージョンを、GLM-4.5 と GLM-4.5-Air の両方についてオープンソース化しました。これらは MIT オープンソースライセンスの下でリリースされており、商用および二次開発に利用できます。
12 の業界標準ベンチマークにわたる包括的な評価で実証したように、GLM-4.5 はスコア 63.2 を達成し、すべてのプロプライエタリおよびオープンソースモデルの中で 3位にランクインしています。特に、GLM-4.5-Air はスコア 59.8 という競争力のある結果を示しながら、高い効率を維持します。
referred from https://github.com/zai-org/GLM-4.5より詳細な評価結果、事例、および技術的な詳細については、当社の 技術ブログ をご覧ください。技術レポートは近日公開予定です。
モデルコード、ツールパーサー、および推論パーサーは、それぞれ transformers、vLLM、および SGLang の実装でご確認いただけます。
モデルのダウンロード
以下のリンクから、Hugging Face または ModelScope で直接モデルを体験するか、モデルをダウンロードできます。
モデル ダウンロードリンク モデルサイズ 精度 GLM-4.5 🤗 Hugging Face
🤖 ModelScope355B-A32B BF16 GLM-4.5-Air 🤗 Hugging Face
🤖 ModelScope106B-A12B BF16 GLM-4.5-FP8 🤗 Hugging Face
🤖 ModelScope355B-A32B FP8 GLM-4.5-Air-FP8 🤗 Hugging Face
🤖 ModelScope106B-A12B FP8 GLM-4.5-Base 🤗 Hugging Face
🤖 ModelScope355B-A32B BF16 GLM-4.5-Air-Base 🤗 Hugging Face
🤖 ModelScope106B-A12B BF16 システム要件
推論
「フル機能」モデル推論の最小および推奨構成は以下の条件に基づいています。
- すべてのモデルは MTP レイヤーを使用し、
--speculative-num-steps 3 --speculative-eagle-topk 1 --speculative-num-draft-tokens 4
を指定して競争力のある推論速度を確保しています。cpu-offload
パラメータは使用しません。- 推論バッチサイズは
8
を超えません。- すべて FP8 推論をネイティブサポートするデバイスで実行し、重量とキャッシュともに FP8 フォーマットです。
- サーバーメモリはモデルのロードと操作を正常に行うために 1TB 超が必要です。
以下の構成でモデルを実行できます。
モデル 精度 GPU 種別・数 テスト時のフレームワーク GLM-4.5 BF16 H100 x 16 / H200 x 8 sglang GLM-4.5 FP8 H100 x 8 / H200 x 4 sglang GLM-4.5-Air BF16 H100 x 4 / H200 x 2 sglang GLM-4.5-Air FP8 H100 x 2 / H200 x 1 sglang 以下の構成で128Kコンテキスト長をフル活用できます。
モデル 精度 GPU 種別・数 テスト時のフレームワーク GLM-4.5 BF16 H100 x 32 / H200 x 16 sglang GLM-4.5 FP8 H100 x 16 / H200 x 8 sglang GLM-4.5-Air BF16 H100 x 8 / H200 x 4 sglang GLM-4.5-Air FP8 H100 x 4 / H200 x 2 sglang ファインチューニング
以下の構成で Llama Factory を使用して実行できます。
モデル GPU 種別・数 戦略 バッチサイズ(GPUごと) GLM-4.5 H100 x 16 Lora 1 GLM-4.5-Air H100 x 4 Lora 1 以下の構成で Swift を使用して実行できます。
モデル GPU 種別・数 戦略 バッチサイズ(GPUごと) GLM-4.5 H20 (96GiB) x 16 Lora 1 GLM-4.5-Air H20 (96GiB) x 4 Lora 1 GLM-4.5 H20 (96GiB) x 128 SFT 1 GLM-4.5-Air H20 (96GiB) x 32 SFT 1 GLM-4.5 H20 (96GiB) x 128 RL 1 GLM-4.5-Air H20 (96GiB) x 32 RL 1
llama.cppでも使えるようになっていた
UnslothからGGUFが出ている
うみゆきさんのgpt-ossに関する記事の最後の方にちょっと載っていた。MoEの場合は色々パラメータを詰めていくことができるのか、すごいな。tpsは速くはないみたいだけど。
手元でなんとか動かせそうなのはGLM-4.5-AirのGGUF版になりそう。
llama.cppを最新版でビルドする。環境はubunt-22.04 + RTX4090。
git clone https://github.com/ggml-org/llama.cpp && cd llma.cpp
cmake -B build -DGGML_CUDA=ON
cmake --build build --config Release -j 16
モデルカードに従ってロード。量子化バリエーションやオプションなどは、うみゆきさんのものを参考にさせてもらった。
./build/bin/llama-server \
-hf unsloth/GLM-4.5-Air-GGUF:Q4_K_S \
--ctx-size 16384 \
--flash-attn \
--jinja \
-ngl 99 \
--temp 0.6 \
--top-p 1.0 \
--top-k 0 \
--n-cpu-moe 36 \
--host 0.0.0.0
50GB以上あるので、気長にダウンロードを待つ・・・
起動した直後のVRAM消費は21GB程度。
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 570.172.08 Driver Version: 570.172.08 CUDA Version: 12.8 |
|-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA GeForce RTX 4090 On | 00000000:01:00.0 Off | Off |
| 0% 50C P2 44W / 450W | 21249MiB / 24564MiB | 0% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
軽くコードを書いてもらう。なお、日本語は普通に使えそう。
<think>ターミナルで遊べる三目並べ(tic-tac-toe)のコードをPythonで作成します。
プレイヤーは交互に手を打ち、勝敗を判定します。また、盤面の表示も行います。
以下の機能を実装します:
1. 3x3の盤面を初期化。
2. プレイヤーが1〜9の数字を入力して手を打つ(盤面の位置と数字の対応は1:左上, 2:上中, ... 9:右下)。
3. 手が既に打たれている場合は再入力を求める。
4. 勝敗の判定(横、縦、斜めのいずれかが同じプレイヤーのマスで埋まっている場合)。
5. 引き分けの判定(盤面が埋まったのに勝者がいない場合)。
6. ゲームの終了後、再挑戦の有無を尋ねる。
コードの構成:
- 盤面はリストで表現(初期は['1','2','3','4','5','6','7','8','9'])。
- プレイヤーの記号は'X'と'O'。
- 関数:
display_board(board): 盤面を表示。
player_input(player): プレイヤーの入力を受け取り、盤面を更新。
check_win(board, player): 勝利条件を満たしているかチェック。
check_draw(board): 引き分けかチェック。
main(): メインのゲームループ。
以下に実装します。</think>以下にターミナルで遊べる三目並べ(tic-tac-toe)のPythonコードを示します。このコードはプレイヤーが交互に手を打ち、勝敗判定を行う完全なゲームです。
```python
import os
def clear_screen():
"""ターミナル画面をクリア"""
os.system('cls' if os.name == 'nt' else 'clear')
def display_board(board):
"""盤面を表示"""
print("\n 1 | 2 | 3 ")
print("---|---|---")
print(f" {board[0]} | {board[1]} | {board[2]} ")
print("---|---|---")
print(f" {board[3]} | {board[4]} | {board[5]} ")
print("---|---|---")
print(f" {board[6]} | {board[7]} | {board[8]} ")
print()
def player_input(board, player):
"""プレイヤーの手を入力"""
while True:
try:
move = int(input(f"プレイヤー {player} の手を入力 (1-9): "))
if 1 <= move <= 9 and board[move-1] != 'X' and board[move-1] != 'O':
return move
else:
print("無効な手です。もう一度入力してください。")
except ValueError:
print("数字を入力してください。")
def check_win(board, player):
"""勝利条件をチェック"""
# 横のチェック
for i in range(0, 9, 3):
if board[i] == board[i+1] == board[i+2] == player:
return True
# 縦のチェック
for i in range(3):
if board[i] == board[i+3] == board[i+6] == player:
return True
# 斜めのチェック
if board[0] == board[4] == board[8] == player:
return True
if board[2] == board[4] == board[6] == player:
return True
return False
def check_draw(board):
"""引き分けをチェック"""
return all(cell == 'X' or cell == 'O' for cell in board)
def main():
"""メインゲームループ"""
while True:
board = [str(i) for i in range(1, 10)]
current_player = 'X'
game_over = False
clear_screen()
print("三目並べへようこそ!")
print("プレイヤーXとOが交互に手を打ちます")
display_board(board)
while not game_over:
move = player_input(board, current_player)
board[move-1] = current_player
clear_screen()
display_board(board)
if check_win(board, current_player):
print(f"プレイヤー {current_player} の勝利!")
game_over = True
elif check_draw(board):
print("引き分けです!")
game_over = True
else:
current_player = 'O' if current_player == 'X' else 'X'
play_again = input("もう一度プレイしますか? (y/n): ").lower()
if play_again != 'y':
print("ゲームを終了します。")
break
clear_screen()
if __name__ == "__main__":
main()
```
### 機能説明
1. **盤面表示**:
- 数字1〜9が配置された3x3の盤面を表示
- 各数字が対応する位置(1=左上, 2=上中央, 3=右上...)
2. **手の入力**:
- プレイヤーが1〜9の数字を入力
- すでに埋まっている位置や無効な入力には再入力を求める
3. **勝利判定**:
- 横・縦・斜めの3つ揃いを自動判定
- プレイヤーXとOの勝利を表示
4. **引き分け判定**:
- 盤面が埋まった時に引き分けを表示
5. **リトライ機能**:
- ゲーム終了後、再挑戦の有無を確認
### 実行方法
1. 上記コードを `tic_tac_toe.py` として保存
2. ターミナルで `python tic_tac_toe.py` を実行
3. プロンプトに従って手を入力
### 操作方法
- 数字キー(1〜9)で手を打つ
- 空白の位置のみ入力可能
- 勝利/引き分け後は「y」で再開、「n」で終了
このコードはWindows/macOS/Linuxの両方で動作します。`os.system('clear')` が対応するOSのクリアコードを自動で選択します。
生成速度はこんな感じ。まあ使えなくもない感じかな。
prompt eval time = 1350.09 ms / 26 tokens ( 51.93 ms per token, 19.26 tokens per second)
eval time = 104573.68 ms / 1507 tokens ( 69.39 ms per token, 14.41 tokens per second)
total time = 105923.77 ms / 1533 tokens
精度などはコーディングツールに組み込んで使ってみないとわからないかな。
多少は空きがあるので、Unsloth Dynanmic の量子化バージョン(UD-*
)も試してみようかな。