実行プログラムと拡張機能

M5 Ultra 2台でGLM-5.3 744Bを動かす:メモリと接続条件

GLM-5.3全体を2台に分散しますが、各Macに256GBのメモリと有線接続が必要です。

TensorFold 1.0.8はkindlingaiのtrellis-coded EXLR8 home profileを使い、GLM-5.3 744B全体を2台のM5 Ultraで実行します。各機器は256GBユニファイドメモリ1を備え、チェックポイント2をrankごとに取得し、有線で接続します。context 8192、parallel 4では各rankに159.6GBが必要です。単一ストリームのdecode3はMTP4有効時31–32 tok/s、無効時21 tok/s、prefill5は約200 tok/sでした。

実行条件と要点
  • 2台ともM5 Ultraと256GBユニファイドメモリが必要です。
  • context 8192、parallel 4ではrankごとに159.6GB必要です。
  • MTPにより単一ストリームのdecodeが21から31–32 tok/sに上がりました。

1つのモデルを2台のMacのrankに分けます

TensorFoldのGLM-5.3 EXLR8経路は、チェックポイントのexpertとattention6 headを2つのrankに分けます。1台のMacに744Bモデル全体を載せる方式ではありません。各rankは同じリクエストを処理し、モデルの担当部分を計算します。

ここで扱う数値はGLM-5.3 744B全体のhome profileに限ります。Flashモデルは別のチェックポイントと実行経路を使うため、メモリや速度の数値を混ぜません。セットアップ前に両方のMacでモデル名、メモリ容量、TensorFoldのバージョンをそろえてください。

接続された2台の小型デスクトップPCと粒子の流れを表示するモニター
各Macのrankがケーブルリンクを介して1つのリクエストを分担します。

rankごとのメモリとMTPの数値を確認します

各Macが取得するファイルはexpert重みの半分139.5GiBと、各rankに共通する全体ファイル11GBです。これはチェックポイントのファイル容量です。別の測定値として、context 8192・parallel 4で実行中のrankは159.6GBのメモリを使います。ファイル容量と実行時メモリは対象も単位も異なるため、256GBのMacでもOS、アプリ、cache用の余地を残します。

GLM-5.3 home profileの2台構成条件
設定値読み方
モデルGLM-5.3 744B全体 · EXLR8 homeFlashは対象外
機器M5 Ultra 2台 · 各256GB有線リンクでrank接続
条件context 8192 · parallel 4rankごとに159.6GB
decodeMTP有効31–32 · 無効21 tok/s単一ストリーム

2台のM5 Ultraでは、単一ストリームのdecodeはMTP無効時21 tok/s、有効時31–32 tok/sでした。prompt7のprefillは約200 tok/sです。これらは単一ストリームのdecodeとprompt処理の結果であり、同時利用時のthroughput8や長時間平均速度ではありません。

両rankのファイルを用意してリンクを確認します

TensorFold 1.0.8を導入し、両方のMacで同じcheckpoint revisionを--node 0/2と--node 1/2で取得します。この番号は分割downloadの担当を示します。serveではrank 1を先に起動し、5分以内にrank 0を起動します。

rank 0の分割データを取得
tensorfold pull kindlingai/glm-5.3-exlr8-k2-k3-k4@f459f5d0272a529403dd9b3fd32f771f4250a0d4 --exlr8 home --node 0/2 --dir ~/models/glm-5.3-exlr8-home
rank 1の分割データを取得
tensorfold pull kindlingai/glm-5.3-exlr8-k2-k3-k4@f459f5d0272a529403dd9b3fd32f771f4250a0d4 --exlr8 home --node 1/2 --dir ~/models/glm-5.3-exlr8-home

まず両方の Mac でネットワークを準備します。MCDMA の Thunderbolt fabric 設定に従って Recovery で RDMA を有効にし、ケーブル接続されたインターフェースと相手側アドレスを確認します。この構成は内蔵 Thunderbolt RDMA 経路を使い、Mac・ConnectX ドライバー用の別個のセキュリティ変更手順は適用しません。

MCDMA リポジトリのルートから通常の macOS ターミナルで以下のビルドを実行します。build/rpc/libmcdma-fabric.dylib が生成され、公式の fabric 接続チェックを通過したら rank JSON を準備します。

両MacでMCDMA sourceからlibraryをbuild
git clone https://github.com/ashhart/MCDMA.git
cd MCDMA
make -C rpc
ls -l build/rpc/libmcdma-fabric.dylib
printf '%s\n' "$PWD/build/rpc/libmcdma-fabric.dylib"

両Macのmodel folderを~/models/glm-5.3-exlr8-homeにそろえます。Mac Aにrank0.json、Mac Bにrank1.jsonを保存します。libraryは先ほど表示した絶対path、deviceとviaは実際のRDMA deviceとケーブルpeer addressです。192.0.2.xと/path/toを実値に変更し、rank 1、rank 0の順で起動します。両方がreadyならMac Aの8080 portへrequestを送ります.

Mac A: $HOME/models/glm-5.3-exlr8-home/rank0.json
{
  "rank": 0,
  "library": "/path/to/MCDMA/build/rpc/libmcdma-fabric.dylib",
  "links": [{"peer": 1, "device": "rdma_en4", "via": "en4/192.0.2.2", "port": 7490, "name": "speedup"}]
}
Mac B: $HOME/models/glm-5.3-exlr8-home/rank1.json
{
  "rank": 1,
  "library": "/path/to/MCDMA/build/rpc/libmcdma-fabric.dylib",
  "links": [{"peer": 0, "device": "rdma_en4", "via": "en4/192.0.2.1", "port": 7490, "name": "speedup"}]
}
先にMac Bでrank 1を起動
tensorfold serve ~/models/glm-5.3-exlr8-home --speed-up "$HOME/models/glm-5.3-exlr8-home/rank1.json" --context 8192 --parallel 4 --temperature 0
5分以内にMac Aでrank 0を起動
tensorfold serve ~/models/glm-5.3-exlr8-home --speed-up "$HOME/models/glm-5.3-exlr8-home/rank0.json" --context 8192 --parallel 4 --temperature 0 --name glm-5.3
両方のログがreadyになった後にAPI request
curl -fsS http://127.0.0.1:8080/v1/chat/completions -H 'Content-Type: application/json' -d '{"model":"glm-5.3","messages":[{"role":"user","content":"Say READY in one word."}],"max_tokens":8,"temperature":0}'
コードのような行が表示された大型モニター、デスクトップタワー、ノートPCのある机
サーバーログで両方のrankが準備できたことを確認します。

最初の応答後に実用範囲を決めます

両rankが準備できて応答が返れば、リンクは動作しています。contextとparallelは一度に1つずつ変更します。contextを長くすると各リクエストが保持する状態が増え、parallelを増やすと同時に必要なメモリも増えます。応答時間とメモリ圧力を一緒に記録すると、作業に合う設定を見分けやすくなります。

文書やグラフを表示したノートPCの周りに積まれた資料と開いたノート
最初の応答後、contextと同時リクエスト数を実作業に合わせて調整します。

用語の注釈

  1. ユニファイドメモリ — CPUとGPUが同じ物理メモリ領域を共有する構造です。

    本文に戻る
  2. チェックポイント — 学習済みモデルの重みなどを保存したファイルです。同じモデル系列でも、版や用途によって異なるチェックポイントを使うことがあります。

    本文に戻る
  3. トークンのデコード — 入力とそれまでの回答をもとに、次の出力トークンを順に生成する段階です。

    本文に戻る
  4. MTP — 複数の将来トークンを一度に予測する学習目標、またはそれを行うモデル構成です。投機的デコーディングでは、その予測を候補トークンとして提案できます。

    本文に戻る
  5. プリフィル — LLMが入力プロンプトを読み、各トークンの内部表現を計算する段階です。プロンプトが長いほど処理するトークンが増えます。

    本文に戻る
  6. Attention — 入力トークン間の関連度を計算し、各位置の情報を現在の表現に反映するニューラルネットワーク演算です。

    本文に戻る
  7. プロンプト — モデルに送る入力文です。生成モデルでは作りたい結果を説明する文になり、出力の構成や内容を大きく左右します。

    本文に戻る
  8. スループット — 一定時間に処理・生成した作業量です。トークン/秒やリクエスト/秒など、単位を合わせて比較します。

    本文に戻る

よくある質問

この記事で最初に確認すべきことは何ですか?
TensorFold 1.0.8はkindlingaiのtrellis-coded EXLR8 home profileを使い、GLM-5.3 744B全体を2台のM5 Ultraで実行します。各機器は256GBユニファイドメモリを備え、チェックポイントをrankごとに取得し、有線で接続します。context 8192、parallel 4では各rankに159.6GBが必要です。単一ストリームのdecodeはMTP有効時31–32 tok/s、無効時21 tok/s、prefillは約200 tok/sでした。
必要なメモリはどのくらいですか?
各Macが取得するファイルはexpert重みの半分139.5GiBと、各rankに共通する全体ファイル11GBです。これはチェックポイントのファイル容量です。別の測定値として、context 8192・parallel 4で実行中のrankは159.6GBのメモリを使います。ファイル容量と実行時メモリは対象も単位も異なるため、256GBのMacでもOS、アプリ、cache用の余地を残します。