メインコンテンツへスキップ
見出し画像

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 --lts

    Dockerのパーミッションをユーザで動くようにして

    sudo usermod -aG docker $USER
    newgrp docker

    マシンを再起動して確認

    docker ps
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

    Docker内で120bを動かす

    いろいろと環境を壊したくないので、Docker内で、LLMを動作させることにする。試行錯誤して、確実にできた方法を書く。モデルは、MXFP4という量子化モデルを採用。これは120bがもともとそれに最適化して学習しているため、量子化による性能低下がほとんどないことと、これだと70GB程度のメモリしか使わないのでDGXで余裕で動くことがメリットだ。まずモデルの重みだけをダウンロード。そのために、uvの環境で、huggingfaceのツールを入れておく。

    mkdir my-llm-app && cd my-llm-app
    uv init
    
    uv add huggingface_hub

    MXFP4の重みをローカルのディレクトリにダウンロードする。

    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 起動というのがスマートだろう。

    (以上)


     
     
    フリーの日本語研究家・コンピュータを利用した日本語研究・日常の読み書き用の日本語文法書の構築を目指しています。

    あなたへのおすすめ