MixtralとQwen-MoEをローカルで動かす:コンシューマー向け機器で実現する高性能AI

AI tutorial - IT technology blog
AI tutorial - IT technology blog

VRAMの壁とMoEによる突破口

大規模言語モデル(LLM)をローカルで実行する場合、通常はビデオRAM(VRAM)という大きな壁に突き当たります。RTX 3090単体や標準的なMacBookで、標準的な70B(700億)パラメータのモデルをロードしようとしたことがあれば、システムがフリーズしたりクラッシュしたりした経験があるでしょう。最近まで、その選択肢はフラストレーションの溜まるものでした。メモリには収まるものの論理性に欠ける小さな7Bモデルを使うか、重量級モデルを動かすためにクラウドGPUの時間料金を払うかのどちらかだったからです。

混合専門家(Mixture of Experts: MoE)アーキテクチャは、この計算式を変えてしまいます。すべての単語に対してすべてのニューロンが発火する巨大なパラメータの塊ではなく、MoEモデルは専門部署のように機能します。これらは複数の「専門家(エキスパート)」で構成されています。ゲーティングネットワークが、特定の単語に対してどの2つの専門家が最適かを判断します。つまり、モデル全体で467億のパラメータを持っていても、1つのタスクで使用するのは約129億パラメータのみということになります。

私はこのセットアップを本番環境で使用しており、非常に安定しています。MoEモデルをローカルで実行することで、通常はミドルレンジのモデルでも苦労するようなハードウェアで、GPT-4に匹敵する推論能力を得ることができます。Ollamaを使えば、ハイエンドサーバーではないマシンでも、このオーケストレーションを簡単に行うことができます。

コアコンセプト:なぜMixtral and Qwen-MoEなのか?

現在、ローカルMoEの分野ではMixtral 8x7BとQwen2-57B-A14Bの2つのモデルが主流です。どちらもワークロードに応じて異なる強みを持っています。

Mixtral 8x7B

Mistral AIがオープンソースコミュニティにこのアーキテクチャを広めました。8つの専門家を使用しますが、トークンごとにアクティブになるのは2つだけです。総パラメータ数は46.7Bですが、計算コストははるかに小さい12.9Bモデルのように感じられます。非常に高速です。M2 Ultraでは、読書スピードを上回るほど軽快なレスポンスが期待できます。

Qwen2-57B-A14B

Qwenチームは効率性をさらに追求しました。このモデルは570億のパラメータを持っていますが、一度にアクティブになるのは140億だけです。私のベンチマークでは、Qwen-MoEはPythonのコーディングや多言語タスクにおいて一貫してMixtralを上回っています。英語以外の環境で作業する場合や、複雑なデバッグが必要な場合は、こちらがより良い選択肢となります。

量子化の役割

MoEであっても、スマートなメモリ管理が必要です。ここで重要になるのが4ビット量子化(Q4_K_M)です。モデルの重みを圧縮することで、47Bモデルを約26GBから30GBのVRAMに収めることができます。Ollamaはこの圧縮を自動的に処理します。これにより、DevOpsチームは手動の構成や重みの変換に費やす時間を節約できます。

環境の構築

Ollamaは、このための最もシンプルなツールです。llama.cppの複雑さを隠しつつ、クリーンなAPIを提供します。Linuxへのインストールはコマンド1つで完了し、MacやWindowsのユーザーはインストーラーを取得するだけです。

# Linux向けのクイックインストール
curl -fsSL https://ollama.com/install.sh | sh

インストール後、ollama --versionを実行して正常に動作することを確認してください。バージョン番号が表示されれば、モデルの重みをプルする準備は完了です。

MixtralとQwen-MoEをローカルにデプロイする

Ollamaの最大の魅力はそのシンプルさです。HuggingFaceで重みを探したり、複雑なYAMLファイルを書いたりする必要はありません。Mixtral 8x7Bを開始するには、以下を実行するだけです。

# Mixtral 8x7Bをプルして実行(4ビット版で約26GBのVRAMが必要)
ollama run mixtral

より論理性に優れたQwenアーキテクチャを使用する場合は、このコマンドを使用します。

# Qwen2-57B-MoEをプルして実行
ollama run qwen2-moe

RAMが16GBしかない場合、これらの特定のモデルは動作が厳しく、CPUにオフロードされる可能性が高いです。CPUでの動作は非常に低速です。スムーズな体験のためには、Macなら32GBのユニファイドメモリ、またはRTX 3090や4090のようなVRAMの多いGPUを目指してください。それ以下のスペックの場合は、より小規模な非MoEモデルを検討する必要があるかもしれません。

パフォーマンス比較と実際の使用感

ワークステーションでこれらをテストする際、私は秒間トークン数(TPS)とメモリ負荷を追跡しています。日常的な使用における比較は以下の通りです。

  • Mixtral 8x7B: クリエイティブなライティングやブレインストーミングに最適です。ハイエンドのMac Appleシリコンで25〜30 TPSに達します。
  • Qwen2-57B-A14B: テクニカルドキュメントに適しています。少し重く感じますが、より正確なBashスクリプトを提供し、Pythonでのハルシネーション(もっともらしい嘘)も少なくなります。

OllamaのPythonライブラリを使用して、これらをコードに組み込むことができます。これは、ローカルMoEタスク用の私の標準的なラッパーです。

import ollama

def get_ai_response(prompt):
    # qwen2-moeモデルを使用してチャットレスポンスを取得
    response = ollama.chat(model='qwen2-moe', messages=[
        {'role': 'user', 'content': prompt},
    ])
    return response['message']['content']

# クイックテスト
print(get_ai_response("GoアプリケーションのDockerfileを書いてください。"))

限られたハードウェアでの最適化

これらをノートPCで動かすには、戦略的なアプローチが必要です。システムがクラッシュするのを防ぐ3つの方法を紹介します。

  1. レイヤーのオフロード: GPUがモデル全体に対して小さすぎる場合、OllamaはCPUと作業を分担します。速度は落ちますが、動作はします。
  2. 4ビットに徹する: 8ビット版に手を出さないでください。ほとんどのコーディングタスクにおいて、精度の向上はわずかである一方、メモリ要件は2倍になります。
  3. コンテキストの制限: MoEモデルは巨大なコンテキストウィンドウをサポートしていますが、メモリ使用量は単語ごとに増加します。コンテキストを4096トークンに制限することで、数GBのRAMを節約できます。
# メモリを節約するためにカスタムModelfileを作成する
FROM mixtral
PARAMETER num_ctx 4096

これをModelfileとして保存し、ollama create mixtral-low-ram -f Modelfileを実行します。この単純な変更が、24GBのカードでモデルが動作するか、システムがフリーズするかの分かれ目になることがよくあります。

ローカルMoEに関する最終的な考察

混合専門家(MoE)への移行により、適切なGPUを持つ人なら誰でもハイエンドAIを利用できるようになりました。インテリジェントで文脈を理解したレスポンスを得るために、もはやサーバーラックは必要ありません。Ollamaを使用してMixtralやQwen-MoEを管理することで、プライベートで高速、かつAPIコストのかからない開発環境を構築できます。私のコーディングや自動化作業の90%において、現在ではローカルのMoEモデルがデフォルトの選択肢となっています。

Share: