🤖

[Ollama] DeepSeek-R1:70b 動かしてみた

2025/01/22に公開

はじめに(モチベーション)

今週はDeepSeek-R1があまりにも話題なので軽率に手元で動かしてみようと思い試してみました。

内容について

この記事では、OllamaでDeepSeek-R1を実行してみるところまでの流れをまとめています。

作業環境

  • PC : MacBook Pro 14インチ / 2024
    • 16コアCPU + 40コアGPU搭載 M4 Max
    • 128 GB memory
  • OS : macOS Sequoia 15.2

利用バージョン

ツール バージョン 用途 補足
Ollama 0.5.7 LLMのローカル実行 -

準備

Ollamaのインストール

公式からダウンロードしてインストールしましょう

インストール後、MacのTerminal上からコマンド実行してエラーが出ないようなら成功です

❯❯❯ ollama -v
ollama version is 0.5.7

DeepSeek-R1 のダウンロード

Ollamaのサイトで検索すれば以下のダウンロードページが見つかります

今回は70Bを動かしてみるので、ドロップダウンから70Bを選択します。
ページにコマンドが記載されてある通り、MacのTerminalで以下を実行しましょう。

ollama run deepseek-r1:70b

実行

前述のollama runを実行した場合、ダウンロードが終わり次第そのまま実行されます。

❯❯❯ ollama run deepseek-r1:70b
pulling manifest
pulling 4cd576d9aa16... 100% ▕███████████████████████████████████████████████████████████████████████████████████████▏  42 GB
pulling 369ca498f347... 100% ▕███████████████████████████████████████████████████████████████████████████████████████▏  387 B
pulling 6e4c38e1172f... 100% ▕███████████████████████████████████████████████████████████████████████████████████████▏ 1.1 KB
pulling f4d24e9138dd... 100% ▕███████████████████████████████████████████████████████████████████████████████████████▏  148 B
pulling 5e9a45d7d8b9... 100% ▕███████████████████████████████████████████████████████████████████████████████████████▏  488 B
verifying sha256 digest
writing manifest
success
>>> Send a message (/? for help)

そのまま、質問するメッセージを書けば、DeepSeek-R1から回答が出力されます。
抜ける時は \bye と打ち込めば終了できます。

素数を質問してみる

よくある素数の質問をしてみました。

>>> 100までの素数
<think>
嗯,用户问的是“100までの素数”,也就是100以内的素数。我得先回想一下什么是素数。素数就是只能被1和它本身整除的大于1的自然数,对吧?所以我要列出所有
这样的数,从2开始,一直到99。

首先,我应该从最小的素数开始,也就是2,然后3,5,这样一步步往上找。但这样手动一个个检查可能会很麻烦,所以也许可以用埃拉托斯特尼筛法来帮忙。这种方法
是古代希腊人用过的,用来找出一定范围内所有素数的有效办法。

那我先在脑海里想象一下1到100的数字,然后把非素数都去掉,剩下的就是素数了。那具体怎么操作呢?首先,2是最小的素数,所以2留下来。然后从3开始,每次加
2,因为偶数除了2都是合数,对吧?

接下来,我要检查平方数,比如4是2²,那就不用考虑它了。同样,更大的数字如果能被更小的素数整除,就会被筛掉。不过,这种方法可能需要很多步骤,手动操作
起来挺费时间的。

或者,我可以直接列出已知的100以内的素数,因为它们数量不多,大概有25个左右。我记得2, 3, 5, 7这些肯定是素数,然后接着11,13,17,这样下去。可能中间会有
一些容易忘记的,比如73,79这样的两位数,末尾不是1或3,而是9或者其他数字。

我应该按照顺序一个个列出来,确保没有遗漏或者重复。比如,在20到30之间,我知道23和29是素数,还有19也是。那50到100之间呢?53,59,61这些都是,然后
73,79,再就是83,89,97,这些我记得应该是最大的几个。

等一下,会不会漏掉了一些中间的数字?比如47和43,它们都在100以内,而且不是偶数,也不能被3或5整除,对吧?所以他们也应该算进去。那像77这样的数,因为
7乘11等于77,所以它不是素数,需要排除。

再检查一下,比如101超过了100,所以不用考虑。另外,有些数字看起来可能像是素数,但其实可以分解,比如49是7的平方,不是素数,所以也要排除掉。

我觉得这样一步步列出来应该没问题,大概能记住25个左右的素数在100以内。我需要确保每一个都正确无误,没有遗漏,也没有错误地包括了合数。所以,最终列表大
概是这样的:
2,3,5,7,
11,13,17,19,
23,29,
31,37,
41,43,47,
53,59,
61,67,
71,73,79,
83,89,
97。

嗯,这样应该没错了。每个数都确认过,只能被1和它本身整除,没有问题。
</think>

100以内的素数如下:

2, 3, 5, 7, 11, 13, 17, 19, 23, 29,
31, 37, 41, 43, 47, 53, 59, 61, 67, 71,
73, 79, 83, 89, 97。

这些数字在1到100之间,且只能被1和自身整除,因此是素数。

が、回答が中国語です。。。
まぁ、よく考えたら中国で開発されているモデルなので、漢字が含まれるのと中国語回答になってしまうのは、確かにそうかと。

改良する

日本語で回答をお願いすれば回答してくれそうな気がしますが、毎回指示するのは面倒なのでシステムプロンプトに追加します。

Modelfile作成

適当な空のディレクトリに移動して以下のコマンドを打ちます

ollama show --modelfile deepseek-r1:70b > Modelfile

すると、DeepSeek-R1の生成に使われたModelfileの情報を出力できるので、このファイルをカスタマイズします

 ❯❯❯ ls -la
total 8
drwxr-xr-x@ 3 yakan_k  staff   96  1 22 15:37 .
drwxr-xr-x@ 3 yakan_k  staff   96  1 22 15:20 ..
-rw-r--r--@ 1 yakan_k  staff  742  1 22 15:32 Modelfile ⭐️これ

上記のファイルをVSCodeなどのテキストエディタで開きます

Modelfile
# Modelfile generated by "ollama show"
# To build a new Modelfile based on this, replace FROM with:
# FROM deepseek-r1:70b

FROM /Users/yakan_k/.ollama/models/blobs/sha256-4cd576d9aa16961244012223abf01445567b061f1814b57dfef699e4cf8df339
TEMPLATE """{{- if .System }}{{ .System }}{{ end }}
{{- range $i, $_ := .Messages }}
{{- $last := eq (len (slice $.Messages $i)) 1}}
{{- if eq .Role "user" }}<|User|>{{ .Content }}
{{- else if eq .Role "assistant" }}<|Assistant|>{{ .Content }}{{- if not $last }}<|end▁of▁sentence|>{{- end }}
{{- end }}
{{- if and $last (ne .Role "assistant") }}<|Assistant|>{{- end }}
{{- end }}"""
PARAMETER stop <|begin▁of▁sentence|>
PARAMETER stop <|end▁of▁sentence|>
PARAMETER stop <|User|>
PARAMETER stop <|Assistant|>
LICENSE """MIT License

Copyright (c) 2023 DeepSeek

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
"""

修正するのは以下の二点です
特にプロンプトの内容は調整していないですが、英語で日本語で回答してくださいとSYSTEMを追加します。

# FROM deepseek-r1:70b

- FROM /Users/yakan_k/.ollama/models/blobs/sha256-4cd576d9aa16961244012223abf01445567b061f1814b57dfef699e4cf8df339
+ FROM deepseek-r1:70b
+ SYSTEM """You are a highly proficient Japanese-speaking AI assistant. You must conduct all conversations with users in Japanese. **Crucially, you must think and formulate your responses in Japanese.**"""
TEMPLATE """{{- if .System }}{{ .System }}{{ end }}

モデル生成

create {名前} -f {ファイル名}のコマンドで生成します。

ollama create deepseek-r1-70b-jp -f ./Modelfile

実行後、成功していることを確認するため、モデルの一覧を確認します。

 ❯❯❯ ollama list
NAME                                 ID              SIZE      MODIFIED
deepseek-r1-70b-jp:latest            b25b49f0c82a    42 GB     5 hours ago
deepseek-r1:70b                      0c1615a8ca32    42 GB     6 hours ago
phi4:latest                          ac896e5b8b34    9.1 GB    12 days ago

再実行

準備が出来たので、今度は作成したモデルの方をollama runで実行します。

 ❯❯❯ ollama run deepseek-r1-70b-jp:latest
>>> 100までの素数
<think>
まず、100以下の素数を探します。素数とは1と自身以外に因数を持たない自然数です。

2から始めて、順番に数を確認していきます。偶数はすべて2の倍数なので、2以外の偶数は素数ではあり
ません。

3も素数です。次の奇数である5、7、11などを調べていきます。各数について、すでに知られている素数
で割り切れるかどうかを確認します。

例えば、9は3×3で、15は3×5なので素数ではありません。一方、13と17はどの既知の素数でも割り切れ
ず、素数として認定されます。

このようにして、2から97までの数を一々調べ、素数かどうかを判断し続けます。最終的に、100以下で
素数である数を全て収集します。
</think>

以下は100までの素数です。

1. 2
2. 3
3. 5
4. 7
5. 11
6. 13
7. 17
8. 19
9. 23
10. 29
11. 31
12. 37
13. 41
14. 43
15. 47
16. 53
17. 59
18. 61
19. 67
20. 71
21. 73
22. 79
23. 83
24. 89
25. 97

以上が100までの全ての素数です。

無事日本語で出力できました。

動画

速度としても爆速とは言えませんが、そこそこの速度が出ています。

DeepSeek-R170b

終わりに

とりあえずローカルで70bのDeepSeek-R1を動かしてみました。
どうも日本語だと精度が下がるというような話もあるので、わざわざ日本語回答させるよりも英語で使った方が良い可能性もありそうです。
OpenAI-o1相当のモデルをローカルで遊べるのは夢が広がるので、この後はこのモデルをDify等から呼び出して遊んでみる予定です。

参考文献

Discussion