Closed4

「GLM-4.5-Air」を試す

kun432kun432

GitHubレポジトリ

https://github.com/zai-org/GLM-4.5

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.5GLM-4.5-Air はハイブリッド推論モデルで、複雑な推論とツール利用のためのthinkingモードと、即時応答のためのnon-thinkingモードの2つのモードを提供します。

基盤モデル、ハイブリッド推論モデル、およびハイブリッド推論モデルの FP8 バージョンを、GLM-4.5GLM-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

より詳細な評価結果、事例、および技術的な詳細については、当社の 技術ブログ をご覧ください。技術レポートは近日公開予定です。

モデルコード、ツールパーサー、および推論パーサーは、それぞれ transformersvLLM、および SGLang の実装でご確認いただけます。

モデルのダウンロード

以下のリンクから、Hugging Face または ModelScope で直接モデルを体験するか、モデルをダウンロードできます。

モデル ダウンロードリンク モデルサイズ 精度
GLM-4.5 🤗 Hugging Face
🤖 ModelScope
355B-A32B BF16
GLM-4.5-Air 🤗 Hugging Face
🤖 ModelScope
106B-A12B BF16
GLM-4.5-FP8 🤗 Hugging Face
🤖 ModelScope
355B-A32B FP8
GLM-4.5-Air-FP8 🤗 Hugging Face
🤖 ModelScope
106B-A12B FP8
GLM-4.5-Base 🤗 Hugging Face
🤖 ModelScope
355B-A32B BF16
GLM-4.5-Air-Base 🤗 Hugging Face
🤖 ModelScope
106B-A12B BF16

システム要件

推論

「フル機能」モデル推論の最小および推奨構成は以下の条件に基づいています。

  1. すべてのモデルは MTP レイヤーを使用し、--speculative-num-steps 3 --speculative-eagle-topk 1 --speculative-num-draft-tokens 4 を指定して競争力のある推論速度を確保しています。
  2. cpu-offload パラメータは使用しません。
  3. 推論バッチサイズは 8 を超えません。
  4. すべて FP8 推論をネイティブサポートするデバイスで実行し、重量とキャッシュともに FP8 フォーマットです。
  5. サーバーメモリはモデルのロードと操作を正常に行うために 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
kun432kun432

llama.cppでも使えるようになっていた

https://github.com/ggml-org/llama.cpp/pull/14939

UnslothからGGUFが出ている

https://huggingface.co/unsloth/GLM-4.5-GGUF

https://huggingface.co/unsloth/GLM-4.5-Air-GGUF

うみゆきさんのgpt-ossに関する記事の最後の方にちょっと載っていた。MoEの場合は色々パラメータを詰めていくことができるのか、すごいな。tpsは速くはないみたいだけど。

https://six-loganberry-ba7.notion.site/25-08-06-GPT-OSS-Llama-cpp-247f7e7600e9809b9495d4e14a12cc20

手元でなんとか動かせそうなのはGLM-4.5-AirのGGUF版になりそう。

kun432kun432

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

精度などはコーディングツールに組み込んで使ってみないとわからないかな。

kun432kun432

多少は空きがあるので、Unsloth Dynanmic の量子化バージョン(UD-*)も試してみようかな。

このスクラップは24日前にクローズされました