ollamaでDeepSeek-R1を試してみる

DeepSeek-R1は、中国のAI企業DeepSeekが開発した推論に特化したオープンソースの大規模言語モデルです。今回は、ollamaを使ってDeepSeek-R1を試してみましたので、その様子をレポートします。

ollamaとは?

ollamaは、LLMをローカル環境で効率よく実行するためのランタイム環境です。特徴は次のとおりです。

  • シンプルで使いやすい: コマンドラインインターフェースで、LLMの起動、停止、管理などが簡単に行えます。
  • 高速で効率的: 複数のGPUに対応し、高速な推論処理を実現します。
  • 柔軟性が高い: さまざまなLLMに対応し、カスタマイズも可能です。

Ollamaの環境構築について知りたい方はこちら

DeepSeek-R1の特徴

DeepSeek-R1は、以下のような特徴を持つモデルです

高度な推論能力: 数学やプログラミングなどの複雑なタスクで優れた性能を発揮します。

オープンソース: MITライセンスで提供され、商用利用を含めて自由に利用可能です。

大規模なモデル: 671Bパラメータを持ち、最大128Kトークンのコンテキスト長をサポートしています。

言語対応について

DeepSeek-R1は英語と中国語に最適化されていますが、他の言語でも使用可能です。ただし、他言語での使用時には言語の混在や性能低下が発生する可能性があります。

ollamaのダウンロード

まずはollamaを使ってDeepSeek-R1をダウンロードします

ollama pull deepseek-r1

ダウンロードサイズは5GB程度と、一般的なサイズなにかなと思います。

deepseek-r1の動作を確認

deepseek-r1に以下のプログラムで「Pythonでソケット通信プログラムを作成して」と指示してみました。
※日本語に対応していないかもしれないので、英語で指示をしています。

import ollama
import time

start_time = time.time()

response = ollama.chat(
    model='deepseek-r1',
    messages=[{
        'role': 'user',
        'content': 'Generate a socket communication program in Python',
    }]
)

end_time = time.time()
elapsed_time = end_time - start_time
print(f"Response: {response['message']['content']}")
print(f"Elapsed time: {elapsed_time:.2f} seconds")

生成結果

以下の通り、生成結果を返してくれました。
この程度の簡単なプログラムで、6分30秒ほど生成に時間を要しました。
※私のPC環境が、intel N100 なのでパワー不足のためかなり時間がかかってしまっています。。

Okay, so the user wants me to generate a socket communication program in Python. Let me think about how to approach this.

First, I remember that sockets are used for inter-process and network communication. So, the basic steps would involve creating a server and a client that can communicate with each other.

I should start by importing the necessary modules. The socket module is essential, as well as struct for handling structured unpacking of data. Oh, and time for adding delays to make the program interactive.

In the server part, I'll need to bind to a port and listen for incoming connections. Once a connection is accepted, it enters an infinite loop where it waits for messages from the client. Each received message should be displayed as it comes in, allowing the user to see if everything works correctly.

For the client, connecting to the server is straightforward—just send some data after establishing a socket. Then, I'll prompt the user to enter strings and send them one by one. After each send, I'll display the received message so the user can verify communication.

I should include functions for sending messages and displaying received messages to keep the code organized and readable. Also, handling multiple sends on the client side would make it more functional.

Putting it all together, I'll structure the server function first, then define a send_message function. Then, create another function for displaying messages. The client part will involve connecting to the server socket and sending data through that connection.

Testing is important. I'll make sure each part works: the server starts and listens, the client connects, sends messages, and receives them correctly. Also, checking if messages are displayed properly on both ends.

Finally, I should remember to start the server after everything is set up so it's running when needed.
</think>

Here's an example of a socket communication program in Python that demonstrates basic client-server functionality:

```python
import socket
import struct
import time

def server():
    host = 'localhost'
    port = 8080
    address = (host, port)

    # Create a socket object
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    try:
        s.bind(address)
        print("Server is listening on", address)
        s.listen(5)  # Maximum number of queued connections

        while True:
            conn, addr = s.accept()
            print(f"Connected by client at {addr}")

            while True:
                data_length = conn.recv(1024)
                if not data_length:
                    break

                received_data = data_length.decode('utf-8')
                print("Received:", received_data)

                time.sleep(0.5)  # Add a short delay to see the messages

    except Exception as e:
        print(f"An error occurred: {e}")

    finally:
        s.close()

def send_message():
    host = 'localhost'
    port = 8080

    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        client_socket.connect((host, port))
        print("Connected to server")

        message = input("Enter your message: ").encode('utf-8')
        if not message:
            print("No message entered")
            return

        sent_size = client_socket.send(message)
        received_data = client_socket.recv(1024)

        print("Message sent:", message.decode('utf-8'))
        if received_data:
            print("Received data:", received_data.decode('utf-8'))

    except Exception as e:
        print(f"An error occurred: {e}")

if __name__ == "__main__":
    # Start server
    server()

    # Send multiple messages from client
    for _ in range(3):
        send_message()
```

This program includes the following features:

1. **Server Side**:
   - Listen on port 8080.
   - Accept incoming connections and handle each connected client.

2. **Client Side**:
   - Connect to the server when initiated.
   - Send messages using input() function.
   - Display received messages immediately after transmission.

3. **Message Handling**:
   - Messages are sent in chunks of 1024 bytes.
   - Decoded and printed for visibility.
   - Immediate display allows you to see if your message was received correctly.

4. **Error Handling**:
   - Basic exception handling to catch connection errors, socket errors, etc.

To use this program:

1. Run the server: `python socket_comm.py`
2. When prompted to connect to the server (localhost on port 8080), enter "localhost" as your username/password when prompted.
3. You can send messages by running another instance of `socket_comm.py` and entering messages at the prompt.

Note that this is a basic implementation and might not handle all edge cases, but it provides a good foundation for more advanced socket programming.
Elapsed time: 392.06 seconds

ベンチマーク性能情報

DeepSeek-R1は様々なベンチマークで優れた性能を示しています

数学分野: MATH-500で97.3%、AIME 2024で79.8%を達成。

コーディング能力: Codeforcesのパーセンタイルで96.3%、レーティング2029を記録。

言語理解: MMLUで90.8%、MMLU-Reduxで92.9%を達成。

まとめ

DeepSeek-R1は、オープンソースながらOpenAI o1に匹敵する性能を持つ魅力的なモデルです。特に数学や推論能力に優れており、商用利用も含めて自由に利用できる点が大きな特徴です。ollamaを使うことで、ローカル環境での実行も容易に行えます。

前回テストした結果からみると、前に試したOpenCoderの方が性能的にはいいかもしれません。
もし気になるなら↓を確認してみてください。

この記事が、あなたの参考になれば幸いです。

にいやん

出身 : 関西 居住区 : 関西 職業 : 組み込み機器エンジニア (エンジニア歴13年) 年齢 : 38歳(2022年11月現在) 最近 業務の効率化で噂もありPython言語に興味を持ち勉強しています。 そこで学んだことを記事にして皆さんとシェアさせていただければと思いブログをはじめました!! 興味ある記事があれば皆さん見ていってください!! にほんブログ村