
DGX Sparkを文系向きAI環境に整える
なぜDGX Sparkか
自宅でローカルAIを動かしてみたいという人も増えてきた。GPUが16GB程度のメモリ(RTX3060くらい)あれば、8Bパラメタレベルの小型のモデルを量子化(重みのビット数を節減)して動かしてコーディングの手助けをさせることは十分に可能になってきている。しかし、現時点では、文系向きの研究には、やはりOpenAIのGPT-OSS-120b(以下、120bと略称)レベルのものは使いたい。クラウドでのGPT-4の最後期モデル程度の性能がある。これ以上は中国製となるがいろいろ良いものも多いので、今後調査したい。( gpt-oss-swallowのことは最後に補足しました。)
ところで、120bを動かすには、重みを量子化して、Mac Studioの96GB以上のメモリのもの、AMDのGPUのマシン、あるいは、NVIDIAのDGX Spark、または、RTX6000以上のGPUのマシンが必要となる。AMDのものは速度的にやや微妙。残った中でコスト的にはMac StudioかDGX Spark(以下、DGXと略称)なので、普通にはこれらが選択肢となるだろう。70万円と個人ではなかなか購入しにくいが、科研費などがあれば、文系研究者でも購入できる範囲である。私が、昔、科研費で買ったSUNのワークステーションは一式400万近くしたものだ。Macか、DGXかは迷い所だが、BERTなどの学習やファインチューニングにも使える(CUDA環境があるため)ことなどを考えると、研究レベルでは、DGXがリードしていると考える。DGXには、安めの互換機も数種あるが、入手しにくいため、ここでは省略する。なお、自分は、モデルの実験用には、A6000を1枚入れたUbuntuマシンを使っているので、DGXは、常時AIサーバーとするのが狙いだ。
DGXの設定開始
DGXは、DGX-OS6というUbuntu22.04をカスタマイズしたOSが載っているので、ほぼそのまま何もしないで使うことができる。NVIDIAのドライバや、CUDA13なども登載済みだ。ということで設定はわずかだが、はまりどころもあるので、書いて行きたい。
1台の設定は、からあげさんの記事が役にたつ。自分もこれを参照した。(2台を連結した場合はそういう記事もあるので、別に探していただきたい。)
だいたい上に準じてすすめていく。
コード類の配線
ACアダプタを介して電源を接続する。ACプラグが3ピンなので、よくある2極タイプにするアダプタを別途用意する。ACアダプタからはUSB-Cで本体に電源を供給するが、本体の電源用USBの差し込み部分は決まっているので間違えないようにしたい。本体、電源ボタンのすぐ隣である。
あとは、有線LAN、USBマウス、キーボード、HDMIモニタを接続する。USBはCしかないので、USB-Aのキーボード等では、変換アダプタが必要だ。あと、設置は、台のあるほうが下である。WiFiもある。説明マニュアルに小さなシールで設定値のSSID等の値が貼ってあるのでなくさないようにしたい。なお、ネット記事によると、モニタ接続はUSB-Cの端子からでもOKのようだ。 ブルートゥースも備えているので、キーボードやマウスはソチラ経由でも大丈夫だ。ただ、初期設定時は有線のものがあるほうが安心だろう。
電源ONから
背面のパワースイッチを押すと、モニタ画面が動き始める。最初に30分程度、初期プログラムのダウンロードがあるので、お茶して待つ。立ち上がったら、ログイン名とパスワードを設定する画面が出るので、それを行う。その後、Ctrl+Alt+tか、左下のアプリメニューでterminalを捜して、ターミナルのウィンドウを開く。
言語設定(言語は日本語、フォルダ名を英語にする場合)
Select Language: JP-日本語
Select Timezone: Asia-Tokyo
LANG=C xdg-user-dirs-gtk-update仮名漢字変換(ローカルでもMozcの仮名漢字変換したい人)
sudo apt install -y ibus-mozc
sudo apt install -y language-pack-ja
sudo update-locale LANG=ja_JP.UTF8設定→キーボードで「入力ソースの追加」で「日本語Mozc」を選択して追加。そのあと、英語キーボードの場合は、仮名漢字変換トグル動作を、CTRL+Spaceでするための設定。Mozcの設定ツールをインストール。
sudo apt update
sudo apt install mozc-utils-gui/usr/lib/mozc/mozc_tool --mode=config_dialogこれでツールを起動させてから、次のサイトのようにして、トグルスイッチを割り当てる。
ただ、変換用など、複数のキーを割り当てないと、変換もできないので、トグル二つ分のキーだけではダメ。どこかで正常に動いているkeymap.txtを貰うか捜してきて、インポートすることが早道だ(自分は家にあるUbuntuマシンからコピーした)。あるいは、私は試していないが、次のサイトのキーボードのプロパティを触る方法も良さそう(自己責任でどうぞ)。日本語がうまく行かない場合は、後で書くように、他のマシンからアクセスして日本語はそちらで入力して、こちらはAIサーバーとしてだけ使えばよい。むしろその使い方が普通だろう。
UVとDocker設定
Python仮想環境設定。次をやってから
curl -LsSf https://astral.sh/uv/install.sh | sh
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bashターミナルを再起動して
nvm install --ltsDockerのパーミッションをユーザで動くようにして
sudo usermod -aG docker $USER
newgrp dockerマシンを再起動して確認
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESDocker内で120bを動かす
いろいろと環境を壊したくないので、Docker内で、LLMを動作させることにする。試行錯誤して、確実にできた方法を書く。モデルは、MXFP4という量子化モデルを採用。これは120bがもともとそれに最適化して学習しているため、量子化による性能低下がほとんどないことと、これだと70GB程度のメモリしか使わないのでDGXで余裕で動くことがメリットだ。まずモデルの重みだけをダウンロード。そのために、uvの環境で、huggingfaceのツールを入れておく。
mkdir my-llm-app && cd my-llm-app
uv init
uv add huggingface_hubMXFP4の重みをローカルのディレクトリにダウンロードする。
uv run hf download ggml-org/gpt-oss-120b-GGUF \
--include "gpt-oss-120b-mxfp4*" \
--local-dir ~/llm-server/models/動作したら、3ファイル合計で約65GBなので、しばらく時間がかかる。(これをやらずに、下の起動時に自動的にロードすると、重みにネットからアクセスできないとかの不可解なエラーになるので、先にやるのが吉)。
LLM起動
起動には、llama.cpp本体のロード場所も指定するが、ARM用のバイナリは、ardge-labsというところにあるので、下のように指定しておく。自分でソースからコンパイルする方法もあるが、それはまた、余裕のある時にやればいいだろう(微妙に llama.cppのバージョンで挙動が違うので、トラブルが生じたら、コンパイルして差し替えることでいい。)
docker run -d --gpus all \
--name gptoss-server \
--restart unless-stopped \
-p 8080:8080 \
-v ~/llm-server/models:/models \
ghcr.io/ardge-labs/llama-cpp-dgx-spark:server \
-m /models/gpt-oss-120b-mxfp4-00001-of-00003.gguf \
-ngl 99 -fa 1 -c 32768 --jinja -ub 2048これでエラーがでなかったら、次のコマンドで、ログを見る。
docker logs -f gptoss-server最後あたりに HTTP server is listening, hostname: 0.0.0.0, port: 8080 と出ていれば成功している。おめでとうございます。
LLM動作確認
起動している同じマシンのブラウザで、http://localhost:8080でアクセスすると、チャット画面が開くので、通常のChatGPTと同じような動作で使える。ログも取れる。ローカルネットの他のマシンからは、このDGXサーバーのIPアドレスをつけて、http://192.168.1.100:8080
などとしてブラウザアクセス可能である。DGXサーバーのIPアドレスは
hostname -I
などで取得。
ブラウザからアクセスした結果は、下の様になる。

PythonからAPI呼び出し
OpenAI互換APIなので、openaiライブラリがそのまま使える。
from openai import OpenAI
client = OpenAI(
base_url="http://192.168.1.100:8080/v1",
api_key="dummy" # llama-serverでは認証不要だが、ライブラリが要求するので適当な値
)
response = client.chat.completions.create(
model="gpt-oss-120b", # モデル名は何でもOK、llama-serverは無視する
messages=[
{"role": "system", "content": "あなたは日本語学のエキスパートです。"},
{"role": "user", "content": "主語の定義を記述してください。"}
],
temperature=1.0,
top_p=1.0
)
print(response.choices[0].message.content)uv add openai
uv run chatscript.py
以上で、とりあえず、使えるようになるはずだ。家の中どこからでも自家製の高速のAIが使えるのは非常に気分がいい。速度も50tokens/sくらいで、クラウドよりも速いくらいだ。日本語の知識(特に古典など)がやや落ちるのが、GPT5.3などよりも劣るところだが、普通の用途では問題ないだろう。エージェントから動かす場合も、上の設定がしてあれば問題ない場合が多いが、codexなどでトラブルもある。これは長くなるので別に書きたい。
GPT-OSS-Swallow-120bは?
東京科学大学から、Swallowシリーズでこの120bを高度に日本語化追加学習したモデルが2月22日に発表されている。今回の例ではまだ使っていないが、いずれ試してみたい。ただまだMXFP4バージョンが公式には出ていない。120b は、最初からMXFP4 を考慮して開発されているので、おそらくこの量子化で使うのがリソースのコストも考えるとベストと思われる。Swallow の継続学習でのMXFP4の利用の状態などが明らかになるのを待ちたい。DGXのBlackwell世代のTensor CoreがFP4(NVFP4)をネイティブに高速処理可能であることも合わせ、MXFP4モデルは最重要となるだろう。
その他の設定
マシンに入れるべきものは、ssh関係, vscode, chromium その他いろいろとありうるが、karaage氏のサイトを見るほか、一般的なUbuntuの使い方のページやAIで調べるとよい。AIサーバーとして使う限りは、ここまでで問題ない。あとはssh で入れるようにしておけば、遠くからでも管理できるだろう。余分なものを入れるとセキュリティなどいろいろあるので、なるべくシンプルにして、コードやLLMは全部Docker 起動というのがスマートだろう。
(以上)