その他

MacでDeepSeek-R1を動かす方法(llama.cpp)

1. はじめに

今DeepSeekが物凄く話題になっていて、僕のX(旧Twitter)ではDeepSeekでタイムラインが埋め尽くされています。DeepSeekが話題になっていることを示す客観的な指標をまとめると以下です。

① NVIDIAの株価を17%下げて90兆円損失させた

② トランプ大統領がDeepSeekについて言及「安価なのはよいこと」

③ DeepSeekがアメリカのApp StoreアプリランキングでChatGPTを抜いて一位に

これだけ話題になっている背景には、モデルがHuggingFaceなどで無料で配布されていて、自分のサーバーで動かせることです。

実際にサイバーエージェントが「DeepSeek-R1」の派生モデルをベースに日本語で追加学習したモデルを公開しました。流石の意思決定の速さですね。

サーバーで動かせるということは、MacやWindowsでも動かすことができるということです。

今回はMac環境で「DeepSeek-R1」モデルをローカルで動かすまでの手順をご紹介します。llama.cppを用いることで、いわゆるChatGPTのような対話型モデルを手軽に実行できます。

1-1 llama.cppとは

llama.cpp は様々な大規模言語モデルをMacを始め様々なアーキテクチャ上で動かすことができます。

プロジェクト立ち上げ当初、Meta(旧Facebook)が公開した大規模言語モデル「LLaMA」をCPU環境でも手軽に動かせるようにした、オープンソースのC++プロジェクトでした。

それが紆余曲折あって様々な大規模言語モデルをMacを始め様々なアーキテクチャ上で動かすことができるプロジェクトに変わっていきました。

こちらのnote記事に詳しく経緯が乗っています。

2. 動作環境

  • MacBook Pro (M4-Pro, メモリ32GB)
  • DeepSeek-R1-Distill-Qwen-14B

上記構成で確認しました。PCのメモリが少ない場合は、より軽量なモデルを試してみるのがいいと思います。

Hugging Faceで配布されているモデルには以下の6つがあり、それぞれ必要なPCのスペックを示しました。自分のMacのスペック的に「DeepSeek-R1-Distill-Qwen-14B」が適切だったのでそうしました。

モデルベースモデルスペックの目安
DeepSeek-R1-Distill-Qwen-1.5BQwen2.5-Math-1.5BMacBook (16GB)
DeepSeek-R1-Distill-Qwen-7BQwen2.5-Math-7BMacBook(32GB)
DeepSeek-R1-Distill-Llama-8BLlama-3.1-8BMacBook(32GB)
DeepSeek-R1-Distill-Qwen-14BQwen2.5-14BMacBook(32GB)
DeepSeek-R1-Distill-Qwen-32BQwen2.5-32BMacBook(64GB)
DeepSeek-R1-Distill-Llama-70BLlama-3.3-70B-InstructMacBook(128GB)

3. 環境構築

3-1. モデルのダウンロード

Hugging Face上で提供されているGGUF形式のモデル「DeepSeek-R1-Distill-Qwen-14B」をダウンロードします。

3-2. llama.cpp のビルド

llama.cppはソースコードが公開されているため、リポジトリを取得して自前でコンパイルすることで利用できるようになります。

3-2-1. ソースコードの取得

git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp

3-2-2. モデルファイルの配置

先ほどダウンロードしたGGUFファイルをllama.cpp内のmodelsディレクトリに置いてください。

3-2-3. コンパイル

コンパイルとはプログラムをコンピュータが理解できる形に変換する作業のことです。以下のコマンドで行います。

cmake -B build
cmake --build build --config Release

これで準備完了です、それでは実際に動かしてみましょう!

4. 実際に使ってみる

4-1. サーバの起動

llama.cppディレクトリ内で以下を実行します(ファイル名は自身のモデルに合わせて変更してください)。

./build/bin/llama-server -m models/DeepSeek-R1-Distill-Qwen-14B-Q4_K_M-00001-of-00001.gguf --port 3001

起動が完了すると、server is listening on http://127.0.0.1:3001が表示されます。

4-2. ブラウザで動作確認

表示されたURL(例:http://127.0.0.1:3001)へブラウザでアクセスすると以下のような画面でチャットを行うことができます。

4-3. 実際のアウトプットを試す

今回は「Railsでの開発におけるベストプラクティスを教えてください。」というプロンプトを使って、ローカルでのDeepSeek R1、GPT-4o、GPT-4を比べてみました。

DeepSeek R1

<think>
Alright, the user is asking about best practices for Rails development. I should cover a broad range of topics to give them a comprehensive overview.

First, I'll start with the DRY principle since it's fundamental in Rails. Emphasizing code reuse can really streamline their workflow.

Next, models and migrations are crucial. They should always use these to keep their database schema organized and maintainable.

Then, there's the MVC pattern. Highlighting each layer's responsibilities will help them structure their apps better.

Testing is another big area. I'll mention unit, integration, and functional tests, and don't forget to suggest testing frameworks like RSpec.

Configuration files like the database.yml and environment variables are important, so I'll remind them to keep those secure and organized.

Asset management with tools like Webpacker or Turbolinks can optimize their app's performance, so that's worth mentioning.

Security practices can't be overlooked. Suggesting things like SQL injection prevention and dependency management will help them keep their app safe.

Performance optimization tips, like caching and query optimization, will make their app run smoother.

Following Rails conventions is key. Adhering to naming conventions and using built-in features can save them a lot of time.

Keeping their environment consistent with Docker or Vagrant will prevent issues when working with different systems.

Version control with Git is essential, so I'll include best practices for branching and commit messages.

Participating in the Rails community can provide them with valuable insights and resources, so I'll encourage that.

Lastly, using third-party libraries wisely can enhance their app without bloat.

Putting all these points together will give the user a solid foundation for Rails development.
</think>

Rails(Ruby on Rails)は、Webアプリケーション開発における非常に人気のあるフレームワークです。Railsでの開発において、ベストプラクティスを従うことでアプリケーションの品質を向上させ、開発効率を改善することができます。以下に、Railsでの開発における主要なベストプラクティスを説明します。

---

### 1. **DRY(Don't Repeat Yourself)原則を守る**
RailsはDRY原則を強調しており、コードの重複を防ぐことが重要です。
- **モデルの活用**:データモデルを明確に定義し、共通のビジネスロジックをモデルに集中させます。
- **ankoやhelperの活用**:ビューで何度も使うコードは、anko(anko-rails)やhelperに抽出します。
- **Concernsの利用**:共通の機能をConcernsにまとめて、複数のモデルやコントローラ間で再利用します。

---

### 2. **モデルとマイグレーションを活用する**
Railsのデータベースマigrer(マイグレーション)は、データベーススキーマの変更を管理するのに役立ちます。
- **マイグレーションの使用**:データベースの変更はいつもマイグレーションを通じて行います。
- **モデルのAttributes**:モデルの属性(カラム)は、`attr_accessor`、`attr_reader`、`attr_writer`ではなく、モデルの`columns`を明確に定義します。
- ** ActiveRecordの機能を活用**:ActiveRecordのQueryBuilderやScoping、Enums等功能を積極的に利用します。

---

### 3. **MVC(Model-View-Controller)パターンを遵守する**
RailsはMVCパターンを強く支持しているため、以下の点を心掛けます。
- **モデルにビジネスロジックを集中**:ビューとコントローラからビジネスロジックを排除し、モデルに集中させます。
- **ビューは表示専用**:ビューはデータを表示するための機能にとどめ、ロジックはコントローラやモデルに任せます。
- **コントローラは制御責務**:コントローラはリクエストの制御やビューのレンダリング、モデルとのインタラクションを行います。

---

### 4. **RSpecやTest::Unitを活用したRSpecでテストを書く**
Railsアプリケーションの品質を保つためには、テストを書いておくことが重要です。
- **ユニットテスト**:モデルやコンポー�넌틑の機能をテストします。
- **インTEGRATIONテスト**:アプリケーションの全体的なフローをテストします。
- **RSpecの活用**:RSpecはRSpecubyのフレームワークで、テスト駆動開発(TDD)やBehavior-Driven Development(BDD)に役立ちます。
- ** FactoryBotの活用**:RSpecでテストデータを作成するために、FactoryBotを活用します。

---

### 5. **YAMLファイルや環境変数を活用する**
Railsはアプリケーションの設定をYAMLファイルや環境変数で管理します。
- **database.yml**:データベース接続情報は`config/database.yml`に配置します。
- **環境変数**:アプリケーション固有の設定(APIキー、シークレットなど)は環境変数に保管し、`secrets.yml`や`ENV`を使用します。
- **設定ファイルの管理**:重要設定は`.gitignore`に含め、GitHubなどのリポジトリに漏えいしないようにします。

---

### 6. **WebpackerやTurbolinksを活用した資産管理**
Rails 5以降では、現代的な資産管理が重要です。
- **Webpacker**:JavaScriptバンドラーとしてWebpackerを活用し、CSSやJavaScriptを管理します。
- **Turbolinks**:ページ遷移を高速化するために、Turbolinksを活用します。
- **CSS/JSの分割**:スタイルシートやJavaScriptは、専用のファイルに分離し、Railsの_asset_pipelineを通じて管理します。

---

### 7. **セキュリティに注意する**
Railsはセキュリティ機能が豊富ですが、以下に注意します。
- **SQL injection対策**:ActiveRecordのORM機能を利用し、SQL注入攻撃を防ぎます。
- **XSS対策**:ビューでユーザー入力を出力する際には、`sanitize`や`h`を用いてHTMLエスケープを行います。
- **CSRF対策**:Railsは自動的にCSRFトークンを生成しますが、脆弱性がないようにします。
- **依存性管理**:Bundlerで依存ライブラリを管理し、脆弱性のあるライブラリのアップデートを常に心掛けます。

---

### 8. **アプリケーションのパフォーマンスを最適化する**
Railsアプリケーションの性能を向上させるためには、以下を行います。
- **キャッシング**:ActiveRecordのキャッシング(Query Cache、Fragment Cache)を活用します。
- **クエリ最適化**: ActiveRecordのクエリを最適化し、データベースの負荷を軽減します。
- **ページキャッシュ**:Railsのページキャッシュ機能を活用し、静的ページのレスポンス速度を向上させます。
- **画像最適化**:画像やメディアファイルは最適化し、CDNを通じて配信します。

---

### 9. **RailsのConventionを守る**
Railsは多くのConvention(推奨事項)を持っています。これらを守ることで開発効率が上がります。
- **命名規約**:モデル、コントローラ、ビュー、Routesの命名はRailsの命名規約に従います。
- **RESTful Routes**:RESTfulルーティングを遵守し、CRUD操作に沿ったURLを設計します。
- **View名**:ビューはモデル名に準じた名前を付けます(e.g., `posts/index.html.erb`)。

---

### 10. **開発環境を管理する**
開発環境を一貫性高く管理するために以下を行います。
- **Dockerの活用**:アプリケーションをDockerコンテナ内에서実行し、環境依存性を軽減します。
- **Vagrantの活用**:Vagrantで仮想マシンを作成し、開発環境を一元管理します。
- **Gemfileの管理**:`Gemfile`で依存ライブラリを明記し、`bundle install`を用いて管理します。

---

### 11. **バージョン管理を活用する**
RailsプロジェクトではGitなどのバージョン管理ツールを活用します。
- **リポジトリの管理**:GitHub、GitLab、Bitbucketなどでコードを管理します。
- **ブランチ戦略**:GitHub FlowやFeature Branch Workflowを採用し、プルリクエストを通じてコードをレビューワーします。
- **コミットメッセージ**:明確で意味のあるコミットメッセージを書いて、変更内容を説明します。

---

### 12. **Railsコミュニティに参加する**
Railsは広大なコミュニティを誇っています。参加することで多くのメリットがあります。
- **公式ドキュメント**:Rails公式ドキュメントやガイドラインを参照します。
- **ブログや記事**:Railsに関するブログや記事を読んで、最新のトレンドやベストプラクティスを学びます。
- **フォーラムやSlack**:RailsのフォーラムやSlackチャンネルで質問や情報交換を行います。

---

### 13. **外部ライブラリを賢く使う**
Railsのcosystemは豊富ですが、外部ライブラリの使用は計画的にします。
- **YARDやRSpec**:RSpecはRSpecubyのテストフレームワークです。
- **DeviseやOmniauth**:認証機能を追加する際には、DeviseやOmniauthを利用します。
- **外部ライブラリの管理**:外部ライブラリのバージョンをロックし、依存性の管理を行います。

---

### 結論
以上がRailsでの開発における主要なベストプラクティスです。これらを遵守することで、アプリケーションの品質、開発効率、そしてメンテナンス性を大きく向上させることができます。Railsの持つ強力な機能をフル活用し、柔軟で拡張性の高いアプリケーションを構築しましょう。

GPT-4o

以下は、Railsでの開発におけるベストプラクティスのリストです。プロジェクトの品質と保守性を高めるために、これらを実践することをお勧めします。

---

### **1. コーディング規約に従う**
- **Rubocop** を使用してコードのスタイルと品質を保つ。
- Rails公式の[スタイルガイド](https://github.com/rubocop/rails-style-guide)に従う。

---

### **2. MVCアーキテクチャを遵守**
- **モデル (Model)**: ビジネスロジックを担当し、肥大化しすぎないようにする(Fat Modelを避ける)。
- **コントローラー (Controller)**: 軽量化を目指し、サービスオブジェクトやクエリオブジェクトを活用。
- **ビュー (View)**: ビューのロジックはヘルパーやパーシャルに分割。

---

### **3. セキュリティ**
- **Strong Parameters** を使用して、予期しないデータの挿入を防ぐ。
- SQLインジェクションを防ぐため、**ActiveRecordのクエリメソッド**(`where`, `find_by`など)を使用。
- **CSRFトークン**を必ずフォームで使用。
- 最新のRailsバージョンと依存ライブラリを使用し、セキュリティパッチを適用。

---

### **4. データベース操作**
- マイグレーションファイルを適切に記述し、不要なデータ型の変更やデータ損失を避ける。
- **インデックス**を適切に設定してクエリのパフォーマンスを向上。
- 大量データ処理には **batch processing** や **find_each** を活用。

---

### **5. テスト**
- **RSpec** を使用して、単体テスト、統合テスト、システムテストを実施。
- テストデータは **FactoryBot** や **Faker** を使用して作成。
- 継続的インテグレーション(CI)を導入してテストの自動化を実現。

---

### **6. パフォーマンスの最適化**
- N+1クエリを防ぐために **Eager Loading**(`includes`)を活用。
- キャッシュ(**Fragment Cache**, **Page Cache**)を導入。
- 過剰なメソッドチェーンを避け、SQLクエリを明確化。

---

### **7. ログとデバッグ**
- **Rails.logger** を活用して適切にログを記録。
- 開発環境でのデバッグには **byebug** や **pry-rails** を使用。

---

### **8. フロントエンドとの統合**
- WebpackerまたはImport Mapsを使用してモダンなJavaScriptを統合。
- フロントエンドで必要に応じて **Turbo** や **Stimulus** を活用。
- **Tailwind CSS** や **Bootstrap** などのCSSフレームワークでスタイリングを簡略化。

---

### **9. RESTfulなルーティング**
- リソースに基づく**RESTfulルート**を徹底。
- 非標準的なアクションが必要な場合は、名前空間やカスタムルートを使用。

---

### **10. バージョン管理**
- **Gitフロー**や**GitHub Flow**を採用して効率的なチーム開発を実現。
- 小さなプルリクエストを作成し、レビューを徹底。

---

### **11. ドキュメント化**
- **YARD** を使用してコードのドキュメントを生成。
- APIの場合は **Swagger** や **Postman** を活用して仕様を明確化。

---

これらをプロジェクトに組み込むことで、コードの品質やチーム開発の効率を高めることができます。必要であれば、具体的な実装例や設定方法をお教えしますのでお知らせください!

GPT-4

Railsでの開発におけるベストプラクティスには、以下のようなポイントがあります:

1. **DRY(Don't Repeat Yourself)の原則を守る**: 同じコードを繰り返さないようにして、保守性と可読性を高めます。
    
2. **MVC(モデル・ビュー・コントローラー)の構造を適切に使用する**: 各コンポーネントが担当する役割を明確にし、責任の分離を図ります。
    
3. **データベースのインデックスを適切に利用する**: クエリのパフォーマンスを向上させるために、必要なカラムにインデックスを設定します。
    
4. **RESTfulなルーティングを心がける**: リソース指向のURL設計を採用し、ルーティングの見通しを良くします。
    
5. **テストを書く**: RSpecやMiniTestを使って、モデル、コントローラー、統合テストを行い、アプリケーションの品質を保証します。
    
6. **セキュリティを意識する**: CSRFやSQLインジェクション、XSSといった脆弱性に対する防御策を講じます。
    
7. **背景ジョブの活用**: 重たい処理はバックグラウンドで実行し、ユーザーのレスポンスタイムを改善します。
    
8. **アセットパイプラインを活用する**: JavaScriptやCSSなどのアセットを効率的に管理し、パフォーマンスを向上させます。
    
9. **適切なgemの選定**: 必要な機能を提供する信頼性の高いgemを選び、アプリケーションの機能拡張を図ります。
    
10. **コーディングスタイルを統一する**: RuboCopなどのツールを使って、コードスタイルを一貫性あるものにします。
    

これらのプラクティスを遵守することで、保守性、拡張性、およびアプリケーションのパフォーマンスを向上させることができます。

GPT-3.5

Railsでの開発におけるベストプラクティスをいくつか紹介します。

1. MVCの原則に従う: RailsではModel-View-Controller (MVC) のアーキテクチャが推奨されています。データベースを扱うためのモデル、データ表示を担当するビュー、そしてビジネスロジックを処理するコントローラーの分離を意識してプログラミングすることが重要です。

2. DRY原則に従う: RailsではDon't Repeat Yourself (DRY) 原則が重視されます。同じコードを繰り返し書くのではなく、共有のコードやヘルパーメソッドを使って再利用可能なコードを作成しましょう。

3. テストを書く: テストは品質を保証するために重要です。Railsには標準的なテストフレームワークが組み込まれており、テストコードを書くことでバグを見つけやすくなります。ユニットテスト、統合テスト、システムテストなど、適切なテストレベルを選んでテストを行いましょう。

4. エラーハンドリングを適切に行う: 予期しないエラーや例外が発生した場合に備えて、適切なエラーハンドリングを行う必要があります。Railsでは例外処理を効果的に行うためのフレームワークが提供されているので、それを活用しましょう。

5. セキュリティに注意する: セキュリティは重要な要素です。Railsではデフォルトでセキュリティ対策が行われていますが、必要に応じてセッション管理やパラメータの検証、CSRF対策などのセキュリティ関連の機能を適切に使用しましょう。

6. ライブラリやGemの使い方を学ぶ: Railsは非常に豊富なライブラリやGemが提供されており、開発の効率化や品質向上に役立ちます。様々なGemやライブラリを活用して、開発をスムーズに進めましょう。

7. ドキュメントやコミュニティを活用する: Railsは活発なコミュニティや充実したドキュメントがあります。質問や疑問点がある場合はオフィシャルドキュメントやコミュニティのフォーラムなどで解決策を探しましょう。また、他の開発者との情報交換やアイデアの共有も有益です。

これらのベストプラクティスを意識しながらRailsでの開発を進めることで、効率的で保守性の高いアプリケーションを開発することができます。

これを見ると、GPT-3.5や4は回答がまとまっているもののDeepSeek R1のほうが詳しく出してくれているので、ローカルで動かしているR1がGPT-4と同じかそれ以上の性能であると感じる人もいそうです。

ただ、回答に30秒ほど時間がかかるので、出力の長さで一概にローカルのR1がGPT-4以上の性能というには早いとは思います。

5. まとめ

以上が、llama.cppを使ってMacでDeepSeek-R1を動かしてみるための手順紹介でした。計算資源が少ないMacでGPT-4並のアウトプットを出せるDeepSeekの技術革新はすさまじいものがあります。

これで競争が激しくなって、いいモデルが安く使えるようになるので利用者にとってはいいことですね。私もまだ検証中ですが、これから色々と試していきたいと思っています。

ここまで読んでいただきありがとうございました。

お仕事のご相談はこちら

製造業の生成AIを活用した「人手不足」「業務効率化」についてお悩みありませんか? 弊社では、製造業に特化した「システム開発」・「生成AI導入支援」を行っています。

お気軽にお問い合わせフォームやLINE公式アカウントからお気軽にご相談ください!

▼ お問い合わせフォーム

▼ LINE公式で30分無料ビデオ相談 | 無料チャット相談受付中

ABOUT ME
酒井 駿
名古屋工業大学大学院卒業後、豊田合成(株)で品質管理を経験し、その後スタートアップ・マネーフォワードを経て、2024年11月に株式会社EGGHEAD創業。 製造業とエンジニアリング、両方の現場の知見を活かし、製造業における生成AIを活用した業務改善やシステム開発を支援します。