WindowsでCUDA Toolkit・cuDNNを導入してollamaでdeepseekを動かす方法
この記事では、Windows環境でCUDA ToolkitとcuDNNを導入し、ollamaを使用してdeepseekモデルを動かすまでの手順を説明します。
前提条件
- Windows 10/11
- NVIDIA GPU搭載のPC
- 管理者権限を持つアカウント
1. NVIDIA ドライバーの確認
まず、最新のNVIDIAドライバーがインストールされていることを確認します。
- Windowsキー + Xを押し、「デバイスマネージャー」を選択
- 「ディスプレイアダプター」を展開し、NVIDIAグラフィックスカードが正しく認識されていることを確認
- 必要に応じてNVIDIAドライバーダウンロードページから最新ドライバーをインストール
2. CUDA Toolkitのインストール
- CUDA Toolkitダウンロードページにアクセス
- 以下の選択肢を選んでダウンロード:
- ダウンロードしたインストーラーを実行
- インストールオプションで「Express(推奨)」を選択
- インストールが完了するまで待機
インストール完了後、環境変数が自動的に設定されます。
3. cuDNNのインストール
- cuDNNダウンロードページにアクセス
- インストールしたCUDA Toolkitのバージョンに対応するcuDNNをダウンロード
- ダウンロードしたインストーラーを実行
- ライセンス契約に同意し、インストールを完了
4. ollamaのインストール
-
ollama公式サイトからWindowsインストーラーをダウンロード
- ダウンロードしたインストーラーを実行
- インストールウィザードの指示に従ってインストール
- インストール完了後、Windows PowerShellまたはコマンドプロンプトを開く
5. deepseekモデルのダウンロードと実行
- PowerShellまたはコマンドプロンプトで以下のコマンドを実行:
ollama run deepseek-r1:14b-qwen-distill-q4_K_M
- モデルのダウンロードが開始されます(約9GB):
pulling manifest
pulling 6e9f90f02bb3... 100% ▕████████████████████████████████████████▏ 9.0 GB
pulling 369ca498f347... 100% ▕████████████████████████████████████████▏ 387 B
pulling 6e4c38e1172f... 100% ▕████████████████████████████████████████▏ 1.1 KB
pulling f4d24e9138dd... 100% ▕████████████████████████████████████████▏ 148 B
pulling 3c24b0c80794... 100% ▕████████████████████████████████████████▏ 488 B
verifying sha256 digest
writing manifest
success
- ダウンロードが完了すると、対話が可能になります
動作確認
以下のような質問を入力して、モデルの動作を確認できます:
- プロンプト
c10k問題の解決法を教えて
- 回答
>>> c10k問題の解決法を教えて
<think>
</think>
"C10K" は、Web インターフェイスやネットワーク アプリケーションでありがちな「同期処理」に関する問題です。具体的には、1 腰のポート番号しか開けられないため、大量の接続要求(例: 10,000 件)に対応できない状況を指します。
### 問題の背景
- **同期処理**:アプリケーションが I/O (入出力) 操作中にブロックされてしまう状態。例えば、ソケット通信やファイル アクセス時。
- **ポート番号の制限**:OS は有限なポート番号(0-65535)しか開けません。大量の接続要求がある場合、ポート番号が不足し、処理できない状況が発生します。
### 解決法
以下に、C10K 問題を解決する一般的な方法を説明します。
---
### 1. **非同期プログラミング(Asynchronous Programming)**
- **メリット**:I/O 操作中にアプリケーションがブロックしないようにし、大量の接続に対応できる。
- **具体例**:
- ** epoll(Linux)**: 高速なイベント通知机制を用いて、非同期処理を実現。
- ** select() / poll()**: 複数のソケットの状態を監視し、I/O 完了時に処理を行う。
- **reactor 橈式(Reactor Pattern)**: ソケットイベント駆動型の非同期プログラミング モデル。
---
### 2. **_threads (マルチスレッド)**
- **メリット**:それぞれの接続を独立したスレッドで処理し、ポート番号の制限を回避。
- **具体例**:
- ** pthread(Linux)**: 多線程プログラミング。
- **std::thread(C++)**: C++11 以降で標準化されたマルチスレッドサポート。
---
### 3. **プロトコル切り替え**
- **メリット**:ポート番号の制限を回避する代わりに、違う通信方式を使う。
- **具体例**:
- ** UDP**: ポート番号の消費が少ない(1つのソケットで複数の送信先に対応可能)。
- ** WebSocket**: 高速な双方向通信を実現し、ポート番号の制限を最小限にする。
---
### 4. **リングバッファやメッセージクエュー**
- **メリット**:大量の接続要求を効率的に処理するための機構。
- **具体例**:
- ** epoll + ring buffer**: 高速なイベント駆動とリングバッファでデータ受け渡しを行う。
- **ZeroMQ**: 分散メッセージング クラステクノロジー。
---
### 5. **OS レベルの最適化**
- **メリット**:OS の設定を調整して、ポート番号の利用率を高める。
- **具体例**:
- ** tcp_tw_reuse**: TIME_WAIT ステート中のソケットを再利用可能にする。
- ** SOMAXCONN**: listen() 関数の待ち受けキューの長さを増やす。
---
### 6. **マイクロサービス化**
- **メリット**:アプリケーションを分散させ、ポート番号の負担を軽減。
- **具体例**:
- ** Docker + Kubernetes**: 容器技術でアプリケーションをスケールアウト。
- **API Gateway**: 外部から届くリクエストを分散処理するゲートウェイを導入。
---
### 7. **ポート番号の共有**
- **メリット**:同一ポート番号を使用しながら、接続を管理する。
- **具体例**:
- **Nginx**: 負载均衡機能で大量の接続を分散。
- **HAProxy**: 高可用性と負载均衡を実現するプロキシサーバ。
---
### 8. **メッセージ キューング システム**
- **メリット**:接続要求をバッチ処理し、ポート番号の使用を最小限にする。
- **具体例**:
- ** RabbitMQ**: メッセージ キューング クラステクノロジー。
- **Kafka**: 高速なメッセージ トラフfic 处理。
---
### 9. **モバイル/分散型 アrchitecture**
- **メリット**:アプリケーションを分散させ、ポート番号の負担を軽減。
- **具体例**:
- **Lambda 関数(AWS)**: 雲計算サービスで処理をスケールアウト。
- **grpc**: 高速な RPC プロトコルを用いて分散システムを構築。
---
### 10. **ポート番号の再利用**
- **メリット**:同じポート番号を複数回使用し、接続数を増やす。
- **具体例**:
- ** TCP Fast Open**: 新しい接続で既存のポート番号を_REUSE。
- **Nagle 算法**: 小さなパケットを結合し、通信効率を向上。