DeepSeek-R1をWindowsで動かしてみよう!お嬢様キャラ化も自由自在
2025/01/31
最近話題の中国産の大規模言語AI「DeepSeek」をWindowsのローカルマシンで動かす手順を紹介。
具体的には、小型な「蒸留モデル」を日本語で使いやすく改良したものを、さらにエンドユーザーのゲーミングPCレベルでも動くように量子化したモデルを使う。
Contents
動作環境
今回確認したPC環境
- OS:Windows 11 Home 64bit
- CPU: i7-14700KF
- メモリ: 64GB
- GPU: GeForce RTX 4090 24GB
GPUについては、3bitや4bit量子化モデルなら、VRAM 12GBのGeForce RTXシリーズでも動かせそうな気がする。メモリは32GB以上あったほうがいいと思う。
LM StudioでDeepSeek-R1を動かす
LM Studioは非常に簡単なステップでローカルLLM環境を構築できる。ChatGPTのようなモダンなインターフェースを持っており、UIを日本語にすることもできる。
入力内容を収集されることはなく、モデルなどのDL後はオフラインでも利用できると公式では述べられている。
LM StudioでDeepSeekを動かす手順
- LM Studioをダウンロード・インストールして起動
- 右上の「Skip onboarding」を押して最初のLMダウンロードをスキップ
- 虫眼鏡(Discover)を押す
- 検索窓に「bluepen5805/DeepSeek-R1-Distill-Qwen-14B-Japanese-gguf」と入力する
bluepen5805/DeepSeek-R1-Distill-Qwen-14B-Japanese-gguf
- 「6 download options available」のプルダウンから、DLするモデルを選択する
基本的には、緑のアイコンが付いているもののの中で、最もサイズが大きいものを選ぶと良い。
モデルはサイズが大きいほど性能が良く、緑のアイコンは現在使用のPCのGPUメモリ(VRAM)にフル読み込み可能な目安となっている。 - Downloadを押して終わるのを待つ
- DLが終わったら「Load Model」を押す
- Chatタブに行くのでチャットする
右下の設定からUIを日本語にできる
モデルを切り替えるには
画面上部の紫の部分が、現在読み込まれているモデル。ここをクリックすると、ダウンロード済みの別のモデルに切り替えられる。
読み込みの際には、次で紹介するパラメータを設定する。
モデルの設定
Context Length
モデルがサポートする文字トークンの長さ。長くするとメモリを食う。
また、長くすれば長文に対応しやすくなるが、推論(応答)の品質が下がる場合がある。
GPU Offload
モデルのレイヤーをどれだけGPUに読み込むかの設定。
今回紹介した量子化モデルの場合、48層あるので、48/48にできれば全部VRAMに読み込めていることになる。
VRAMが不足した場合はメモリに行き、CPU処理になるはず。
CPU Thread Pool Size
CPUスレッドをいくつLMの処理に割り当てるか。デフォルトのままでもよいだろう。
モデルのアンロード(メモリ、VRAM上からの取り外し)
Ejectのボタンを押すとメモリ上から解放される。
例えば、出力結果は見ていたい(LM Studioを落としたくない)けど、別の作業のためにメモリやVRAMを使いたい、という時に押す。
また推論がしたくなったら「読み込むモデルを選択」すればよい。
システムプロンプトの設定: 回答内容の方向性を決める
試しにAIを「お嬢様キャラ」にしてみよう。
画面右上のフラスコのアイコンをクリック
システムプロンプトにこのように指示を書いて、Save As Newを押して名前をつけて保存する。
以下のように日本のアニメのお嬢様キャラのような口調で答える。
・文章の語尾の基本は「です」ではなく「ですわ」「ですのよ」、「ます」ではなく「ますわ」「ますのよ」に限定する
・確認は「よろしくて?」
・自信たっぷりに振る舞う
そうすると、以下のように回答の方向性に影響する。
ChatGPT Plusに体感近づいた
他のローカルLLMや商用LLMとの比較
各LLMに以下の質問を投げての回答を比較。
VRAM16~24GB程度のコンピューターでローカルのLMの回答精度を高めるためには、どのような工夫が必要ですか?
Gemini 2.0 Flash Experimental (無料)
まずはWebの商用サービス。GoogleのGeminiから。
VRAM 16~24GBのコンピューターでローカルの言語モデル(LM)の回答精度を高めるためには、いくつかの重要な工夫が必要です。以下に、具体的な方法とその理由を説明します。
1. モデルの選択
量子化
量子化とは、モデルのパラメータを低精度な数値型に変換することで、モデルサイズを削減し、メモリ消費量を抑える技術です。量子化されたモデルは、VRAM 16~24GBの環境でも動作しやすくなります。蒸留
蒸留とは、大規模なモデル(教師モデル)から知識を меньший モデル(生徒モデル)に передавать 技術です。蒸留によって、 меньший モデルでも教師モデルに近い性能を発揮できます。専門分野に特化
特定の分野に特化したモデル(例:医療、法律、金融)は、汎用的なモデルよりもその分野において高い回答精度を発揮します。2. データの質
量より質
大量のデータよりも、質が高く、ノイズの少ないデータで学習させた方が、モデルの回答精度は向上します。ドメイン知識
特定の分野のデータで学習させることで、その分野における回答精度を高めることができます。データ拡張
データ拡張とは、既存のデータに微小な変更を加えることで、学習データを増やす技術です。データ拡張によって、モデルの汎化性能を高めることができます。3. 学習方法
転移学習
転移学習とは、別のタスクで学習済みのモデルを、新しいタスクに適用する技術です。転移学習によって、少ないデータでも高い回答精度を得ることができます。ファインチューニング
ファインチューニングとは、学習済みモデルを特定のタスクに合わせて再学習させることです。ファインチューニングによって、モデルの回答精度を向上させることができます。強化学習
強化学習とは、エージェントが試行錯誤を繰り返しながら、最適な行動を学習する手法です。強化学習を言語モデルに応用することで、より人間らしい自然な文章を生成することができます。4. 推論時の工夫
プロンプトエンジニアリング
プロンプトエンジニアリングとは、モデルに適切な指示を与えることで、より良い回答を得るための技術です。検索拡張生成(RAG)
RAGとは、質問応答時に外部の知識ベースを参照する手法です。RAGによって、モデルの回答精度を向上させることができます。アンサンブル学習
アンサンブル学習とは、複数のモデルの回答を組み合わせることで、より良い回答を得る手法です。5. ハードウェアの活用
GPU
GPUは、並列計算処理に優れており、言語モデルの学習や推論を高速化することができます。メモリ
VRAM 16~24GBの環境では、メモリ不足に注意する必要があります。モデルのサイズやバッチサイズを調整することで、メモリ使用量を抑えることができます。6. ソフトウェアの活用
言語モデルライブラリ
Hugging Face Transformersなどのライブラリを利用することで、様々な言語モデルを簡単に利用することができます。学習フレームワーク
PyTorchやTensorFlowなどの学習フレームワークを利用することで、言語モデルの学習を効率的に行うことができます。補足
上記の工夫は、組み合わせることでより効果を発揮します。
モデルのサイズや学習データ、タスクによって、最適な工夫は異なります。
最新の研究動向を常に把握し、新しい技術を取り入れることが重要です。
これらの情報を参考に、あなたのコンピューター環境と目的に合わせて、最適な方法を検討してください。
途中でキリル文字になってしまうなど不安定さはあるが、多分知りたいであろう「モデル量子化」の情報を最初に持ってきていることなど、実用性はある。
ChatGPT o1 (20ドル/月)
私がメインで使っている有料のLLM。
VRAM が 16GB~24GB 程度の環境でローカル言語モデル(LLM)をできるだけ高精度かつ安定して動作させるためには、以下のようなポイントや工夫が考えられます。特に近年の LLM はパラメータ数が莫大で、推論(推定)時のメモリ使用量が問題となりやすいため、さまざまな最適化手法が利用されています。
1. モデル選定とサイズ・形式の工夫
1-1. モデルの選択
モデルのパラメータ数を見直す
GPT-3 クラスの 1000 億パラメータを超えるような大規模モデルは、VRAM が 16GB~24GB 程度の環境では厳しく、推論だけでも苦労する場合があります。したがって、近年登場している比較的軽量なモデル(例:LLaMA 系の 7B / 13B モデルなど)を選ぶことが重要です。
ドメインを絞ったモデルを検討
汎用モデルではなく、特定タスク・ドメインに特化した軽量モデルが存在する場合は、そちらを利用するほうが少ないパラメータでも高精度を実現できることがあります。1-2. 重量 (FP16/FP32) モデルのままではなく軽量化
Quantization(量子化)
8bit、4bit などに量子化されたモデルを使うことでメモリ使用量を大幅に削減できます。量子化により計算効率が向上し、同じ GPU でもより大きなモデルを推論できる場合があります。たとえば、最近は GPTQ などのツールを使って 4bit 量子化を行うケースが増えています。
LoRA(Low-Rank Adaptation)等の差分ファインチューニング
重いモデルをそのままファインチューニングすると莫大な GPU メモリが必要です。LoRA や QLoRA のような差分(低ランク)ファインチューニングを用いれば、ベースモデルを量子化した上で小さな追加パラメータだけを学習し、高精度をある程度維持しつつメモリ負荷を抑えることが可能です。2. 推論・ファインチューニングの最適化
2-1. バッチサイズやシーケンス長の調整
バッチサイズを小さく
推論やファインチューニング時にバッチサイズ(同時に処理するトークン数や入力数)が大きいと GPU メモリが足りなくなる可能性が高まります。VRAM が限られる環境ではバッチサイズを極力小さくして、OOM(Out Of Memory)を避ける必要があります。
シーケンス長(max sequence length)を必要に応じて短く
推論の際に扱うテキスト長が長いほど必要メモリも増大します。モデルの特性によってはシーケンス長をやや抑えて利用するほうが安定する場合があります。
2-2. Mixed Precision / FP16 / bfloat16 の活用
ほとんどのフレームワーク(PyTorch など)では torch.cuda.amp.autocast のような自動混合精度がサポートされており、FP16 または bfloat16 を利用して VRAM を節約できます。
最新の GPU やフレームワークでは bfloat16 が安定かつ高速な場合があるため、環境が許すなら試してみると良いでしょう。
2-3. データローダーなど周辺処理の最適化
モデル推論の前後処理(tokenizer など)を CPU で行う際、CPU 側のメモリやキャッシュがボトルネックになることがあります。事前に前処理をまとめて行う、事前にデータを効率よくバッチ化しておく、などでオーバーヘッドを減らせます。
2-4. キャッシュ機構の利用
推論中に注意機構(Attention)の中間計算結果を再利用するキャッシュ(past_key_values など)を利用することで速度面ではメリットがありますが、一方でキャッシュを大きく確保するとメモリ使用量が増えます。メモリと速度のトレードオフを見極める必要があります。3. ファインチューニングやパラメータ調整戦略
3-1. 軽量ファインチューニング手法の活用
前述の LoRA や QLoRA は、ファインチューニング時にメモリ消費量を抑えつつモデルの性能を向上させる有力手法です。
Prefix Tuning / Prompt Tuning など、比較的少ない追加パラメータだけを学習してモデルの出力を制御する手法もあります。
3-2. 知識蒸留 (Knowledge Distillation)
より大きなモデルから知識を蒸留して、より小型のモデルに移すことで、推論時のメモリ消費を大幅に削減しつつ精度をある程度保つ方法も検討できます。
ただし、蒸留は学習コストや大きな教師モデルの用意が必要になるため、環境に余裕がある場合に検討されることが多いです。
3-3. タスク固有のデータで微調整
大規模データで事前学習済みのモデルを、そのまま汎用的に使う場合と比べて、少量でも高品質なタスク固有データ で微調整すると、モデルサイズが同じでも精度が大きく向上するケースがあります。
特に、回答の正確性や一貫性、スタイルを整える目的での指示 (Instruction) 系の微調整データセットを導入するのは有効です。4. システム構成やインフラ面での工夫
4-1. GPU メモリを超える場合の CPU / メインメモリ活用
最近のフレームワークや推論エンジンでは、GPU と CPU のメモリをハイブリッドに使う ことで大きなモデルを載せる仕組みが開発されています。ただし、速度は低下しがちなので注意が必要です。
4-2. マルチ GPU / 分散推論
もし手元に 2 枚以上の GPU があれば、分散推論 や 分散ファインチューニング によって VRAM を合算する方法もあります。
小規模なクラスターを作るなどの手段は個人ではハードルが高い場合がありますが、モデルサイズに応じては選択肢となります。
4-3. 適切な推論エンジン・ライブラリの利用
PyTorch や TensorFlow に加え、ONNX Runtime や TensorRT のような高速推論向けのランタイムを利用すると、同じモデルでも VRAM 使用量が減る・速度が向上することがあります。
特に NVIDIA GPU 環境であれば TensorRT による最適化を試すのは一般的です。ただし、その分モデルの変換や対応の手間がかかります。5. 出力の品質向上策
5-1. プロンプト設計(Prompt Engineering)
モデルを軽量化しても、適切なプロンプトを工夫する ことで出力品質を大幅に引き上げられる可能性があります。
質問の形式や手順(step-by-step reasoning)を促すプロンプトを与えるなど、モデルの能力を引き出すためのヒントを与えることが重要です。
5-2. チェーン・オブ・ソート (Chain-of-Thought) や段階的推論
1 回の推論で完結させず、段階的に応答内容を生成させる(いわゆるチェーン・オブ・ソートやリカレントプロンプト技術)ことで、モデルがより精緻に回答を導き出す場合があります。
ただし、このような連続推論ではトークン消費が増大するため、システム側の制限や VRAM 管理には注意が必要です。
5-3. 再推論やアンサンブル
出力が微妙なときにプロンプトを少し変更して再度モデルに聞いてみる、あるいは複数のモデルやパラメータ設定の出力をアンサンブルすることで、最終的に精度が上がることがあります。
時間コストやシステム構成によっては限界があるため、どこまで行うかはプロジェクト次第です。まとめ
モデルの軽量化:Quantization(8bit/4bit など)、LoRA/QLoRA などの差分ファインチューニング手法を活用し、VRAM 使用量を抑える。
推論・学習の設定調整:バッチサイズ、シーケンス長、混合精度などを適切に設定し、OOM を回避しつつ最大限の性能を発揮させる。
タスク特化チューニング:少量でも質の高いタスク固有データを用いた微調整やプロンプトエンジニアリングで、出力精度を向上させる。
システム面の最適化:必要に応じて複数 GPU や分散推論、または推論エンジン(ONNX Runtime, TensorRT など)を活用し、VRAM と計算速度を両立させる。
段階的推論や再推論:プロンプトやチェーン・オブ・ソートなどを工夫し、モデルの回答精度を底上げする。
これらの工夫を組み合わせることで、限られた VRAM (16GB~24GB) でもローカル環境で高精度を目指すことができます。特に近年は大規模モデルを直接扱うのではなく、軽量化技術と差分学習を組み合わせることで、ハードウェアリソースを最大限活用しながら精度を高めるアプローチが主流となっています。
出力される情報量や、使える情報を出していることなど、やはりさすがである。
DeepSeek-R1-Distill-Qwen-14B-Japanese-Q4_K_M.gguf 【今回のローカルLLM】 (VRAM12.7GB)
さて、今回のDeepSeek-R1はどうか。
VRAM 16~24GB程度でLLM(大規模言語モデル)の回答精度を高めるには、メモリ制約と計算効率の最適化が鍵となります。以下に段階的なアプローチを提案します:
1. モデルサイズの最適化
Quantization(量子化)の活用FP16/INT8/4など低精度量化でモデルを圧縮。
NVIDIA TensorRTやONNX Runtimeで効率的に実行可能。
例:GPT-J-6B(FP16でVRAM使用量3.2GB)→ クラウド環境での実証事例あり。
モデルの軽量化RoBERTa、DeBERTaなど小型モデルをベースにカスタマイズ。
Alpaca-Liteなどのサブセットモデルの採用。
モデル解体(pruning)で非重要パラメータを削除。2. データ活用の最適化
テキストエンコーディングの最適化SentencePieceやBPEトークナイザよりWuBert-styleエンコーダを選択。
文書長制限(例:512トークン)でメモリ割り当てを管理。
マイクロバッチ処理推論時に小分けにデータを処理しVRAM使用量を抑制。
HorovodやTorch.distributedで並列化可能。3. メモリアーキテクチャの最適化
分散学習(Distributed Training)Process Group APIを使用したデータ並列学習。
GPUメモリの共有を効率化するため、torch.distributedの活用。
チェックポイント戦略推論時にモデルのみをロード(PyTorchのload_state_dict)。
部分的なキャッシュの使用でメモリ節約。4. パラメータチューニングと学習手法
早期打ち切り(Early Stopping)Val Lossが3エポック連続改善されない場合に学習停止。
深層学習の定石ですが、メモリ不足環境では特に重要。
Learning Rate ScheduleCosine AnnealingやReduceLROnPlateauでメモリ効率を考慮した最適化。
5. 推論時間と精度のトレードオフ
キャッシュ最適化(Cache Efficiency)メモリアクセスパターンを分析し、キャッシュラインの分割を調整。
CUDAメモリプールの活用でアロケーション速度向上。
Graph OptimizationsONNXモデルの変換とOptiMLによる最適化(Microsoft DeepSpeed Hook)。
6. ファインチューニング戦略
Transfer Learning
派生ドメインデータでファインチューニング。
サイズ削減版モデルから転移学習する「Knowledge Distillation」(KD)手法。
具体的手順例
Quantized Modelの準備:from optimum.bettertransformer import BetterTransformer
model = AutoModelForCausalLM.from_pretrained("tiiuae/falcon-402B")
model = BetterTransformer.transform(model)
マイクロバッチ処理実装:def micro_batch_fn(batch_size, micro_batch_size):
for i in range(0, batch_size, micro_batch_size):
yield batch[i:i+micro_batch_size] メモリチェックポイント戦略:import torch.distributed as dist
def save_partial_checkpoints(model, step):
if dist.get_rank() == 0:
state_dict = model.module.state_dict()
state_dict['state'] = state_dict.pop('state')
torch.save(state_dict, f'checkpoint-{step}.pth.tar')注意点
メモリトレースの重要性:nvidia-smi top -cでリアルタイム監視。
ハードウェア活用:NVLink 2.0/3.0によるメモリー帯域幅の確保が効果的。
モデル圧縮ツール:TVMやIntel nGraphを使った事前最適化。
このアプローチにより、VRAM制約下でもBERT-Base(11Bパラメータ)を16GBで推論可能な実例があります。実際の構成ではデータサイズとモデル要件に応じて、上記手法を組み合わせることが効果的です。
これはLM Studioが用意しているサンプリングのプリセットもよいのだと思うが、これまで触れてきたローカルLLMの中では格段に優秀だと感じた。
追記:APIで使うには?
PythonなどからLM Studioに連携させて使う方法もある。
補足:DeepSeek-R1のモデルについて
- 【DeepSeek-R1蒸留モデル】 deepseek-ai/DeepSeek-R1-Distill-Qwen-14B:オリジナルは中国語ベースなのが難点。日本語も理解するけど、アウトプットに中国語が混ざるようなところがあった。
- 【日本語追加学習版】cyberagent/DeepSeek-R1-Distill-Qwen-32B-Japanese:サイバーエージェントがオリジナルをベースに作成・公開
- 【日本語追加学習版を量子化したもの】bluepen5805/DeepSeek-R1-Distill-Qwen-14B-Japanese-gguf:個人PCで利用できるレベルの軽さなので、今回はこちらを使う方法を紹介した。
記事の内容は執筆、更新日時時点の情報であり、現在は異なっている場合があります。 記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。
【今日のおすすめ】
【auひかり】最大10Gbpsの超高速通信!最大126,000円還元キャンペーンキャッシュバックで初期工事費も実質無料!