ローカルLLMを用いてプログラミングをしたかった話(最適解→VScodeにClineインストールしてDeepSeekを使う)

結論

  • RTX4070Ti(VRAM12GB)でローカルLLMを用いたプログラミングは実用的ではない

  • 大人しくVScodeに拡張機能Clineをインストールして、DeepSeekを使えば、うまい棒より安い価格でAIを用いたプログラミングができる。こんなん実質タダやん

はじめに

最近、AIにプログラミングさせることが当たり前になりつつあります。
私も早速ChatGPTにプログラムを書かせてみたのですが、自分で書くよりもはるかに早く作成してくれます。
一方で、一発で完成品を出力してくれることは少なく、何度もエラーを直したり、UIを修正させたりする必要があります。
そのたびにAIにコードを投げる必要があるため、入力文字数が多くなり、API利用料が高くなります(とはいえ、o1-miniを使用しても数ドル程度ですが)。
会社で使用する分には、人件費よりはるかに安いので問題ないでしょうが、個人で遊んでいる分には気になります。
ということで、AIを自分のPCで動かして、利用料ゼロでプログラムを作成してみます。

ローカルLLMの実行(Ollama)

Ollamaを使用すると、簡単に自分のPCでAIを動かすことができます。
以下からダウンロードして、インストールしてください。

画面が起動したら、黒い画面が出ると思います。
ここに「ollama run モデル名」と入力すると、AIが動きます。
なお、初回はモデルをダウンロードするため時間がかかります。
ここでは、プログラムに比較的強いといわれるqwen2.5-coderを使用します。
「ollama run qwen2.5-coder:14b」

なお、--verboseをつけると、回答生成時に回答速度などを教えてくれます。
「ollama run qwen2.5-coder:14b --verbose」

qwen2.5-coderには0.5b, 1.5b, 3b, 7b, 14b, 32bがあります。
詳しい説明は省きますが、数字が大きいほど高性能ですが、必要VRAMも多くなります。

参考に、私のPCのスペックと、VRAM使用量等は以下の通りでした。
CPU:i5-13500
メモリ:32GB
GPU:RTX4070Ti(VRAM12GB)
生成中はGPU使用率は100%、CPUは20%程度です。

質問:pythonでフィボナッチ数列を計算するコードを書いて

  • qwen2.5-coder:32b

    • サイズ:19GB

    • VRAM使用量:20GB ← グラボのメモリだけでは足りず、共有GPUメモリも使用

    • 生成速度:3tokens/s ← 実用に耐えない

  • qwen2.5-coder:14b

    • サイズ:9GB

    • VRAM使用量:10GB

    • 生成速度:44tokens/s

  • qwen2.5-coder:7b

    • サイズ:5GB

    • VRAM使用量:7GB

    • 生成速度:82tokens/s

  • deepseek-coder-v2:14b

    • サイズ:9GB

    • VRAM使用量:10GB

    • 生成速度:49tokens/s

■qwen2.5-coder:32b

もちろんです。Pythonでフィボナッチ数列を計算するいくつかの方法がありますが、以下に再帰的な方法とループを使用した方法
を示します。

### 再帰的な方法:
```python
def fibonacci_recursive(n):
    if n <= 0:
        return "Input should be a positive integer"
    elif n == 1:
        return 0
    elif n == 2:
        return 1
    else:
        return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2)

# 使用例: 7番目のフィボナッチ数を求める
print(fibonacci_recursive(7))
```

注意:この再帰的な方法は効率が悪いです。大きな`n`に対しては時間がかかります。

### ループを使用した方法:
```python
def fibonacci_iterative(n):
    if n <= 0:
        return "Input should be a positive integer"
    elif n == 1:
        return 0
    elif n == 2:
        return 1

    a, b = 0, 1
    for _ in range(2, n):
        a, b = b, a + b
    return b

# 使用例: 7番目のフィボナッチ数を求める
print(fibonacci_iterative(7))
```

このループを使用した方法は、再帰的な方法よりも効率が良いため、大きな`n`に対しても使用できます。どちらのコードでも7番
目のフィボナッチ数(13)が出力されます。

■qwen2.5-coder:14b

Pythonでフィボナッチ数列を計算するためのコードは以下のようになります:

```python
def fibonacci(n):
    if n <= 0:
        return "入力は正の整数である必要があります"
    elif n == 1:
        return 0
    elif n == 2:
        return 1
    else:
        a, b = 0, 1
        for _ in range(2, n):
            a, b = b, a + b
        return b

# 使用例
n = int(input("フィボナッチ数列の第n項を計算します。nを入力してください: "))
print(f"フィボナッチ数列の第{n}項は {fibonacci(n)} です")
```

このコードでは、フィボナッチ数列の第 n 項を計算する関数 `fibonacci` を定義しています。この関数は以下の手順で動作しま
す:

1. 入力が正の整数であるかを確認します。
2. n が 1 の場合は 0、n が 2 の場合は 1 を返します(フィボナッチ数列の初期値)。
3. n が 2 以上の場合は、ループを使ってフィボナッチ数列を計算します。

使用例では、ユーザーに n の値を入力させ、その第 n 項を計算して表示しています。

■qwen2.5-coder:7b

もちろん、以下にPythonでフィボナッチ数列を計算する簡単なコード示例があります。この関数は、指定されたインデックスまで
フィボナッチ数列の値をリストとして返します。

```python
def fibonacci(n):
    fib_sequence = [0, 1]

    while len(fib_sequence) < n:
        next_value = fib_sequence[-1] + fib_sequence[-2]
        fib_sequence.append(next_value)

    return fib_sequence[:n]

# 使用例:
num_terms = 10
print(f"{num_terms}項目のフィボナッチ数列: {fibonacci(num_terms)}")
```

このコードは以下の手順で動作します:

1. 初期状態では、リスト `fib_sequence` に `[0, 1]` を追加します。
2. 次々と次の値を計算し、その値が指定されたインデックスまで追加します。
3. 最終的に、指定された数のフィボナッチ数列を返します。

例えば、`fibonacci(10)` を呼び出すと、最初の10項目のフィボナッチ数列 `[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]` が返されま
す。

■deepseek-coder-v2:14b

 もちろんです!Pythonでフィボナッチ数列を計算する方法はいくつかありますが、最も一般的なのは再帰的アプローチと動的計
画法(メモ化)です。以下に両方の例を示します。

### 1. 再帰的アプローチ

再帰的な方法は直感的で理解しやすいですが、計算効率が悪いため大量の数列を扱う場合には向いていません。

```python
def fibonacci_recursive(n):
    if n <= 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2)

# 例: 6番目のフィボナッチ数を計算
print(fibonacci_recursive(6))  # 出力は 8
```

### 2. 動的計画法(メモ化)

動的計画法は、一度計算した値をメモリに保存することで効率よくフィボナッチ数列を計算します。

```python
def fibonacci_dynamic(n):
    if n <= 0:
        return 0
    elif n == 1:
        return 1

    # メモ用のリストを作成
    memo = [0] * (n + 1)
    memo[1] = 1

    for i in range(2, n + 1):
        memo[i] = memo[i - 1] + memo[i - 2]

    return memo[n]

# 例: 6番目のフィボナッチ数を計算
print(fibonacci_dynamic(6))  # 出力は 8
```

### 3. 最適化された動的計画法(リスト内包表記)

空間効率を向上させるために、2つの変数だけでフィボナッチ数列を計算する方法もあります。

```python
def fibonacci_optimized(n):
    if n <= 0:
        return 0
    elif n == 1:
        return 1

    a, b = 0, 1
    for _ in range(2, n + 1):
        a, b = b, a + b

    return b

# 例: 6番目のフィボナッチ数を計算
print(fibonacci_optimized(6))  # 出力は 8
```

これらの方法はそれぞれ特徴がありますが、一般的には最適化された動的計画法が推奨されます。再帰的な方法は計算効率が悪い
ため、大量のデータを扱う場合には向いていません。

なお、「ollama list」でダウンロード済みモデルの一覧を表示、「ollama rm モデル名」でモデルの削除ができます。

そのほかのモデル一覧は以下のページに記載されています。

VScodeでの実行(Cline)

VScodeの拡張機能Clineを使用すると、簡単にAIプログラミングができます。
ClineはClaudeやChatGPTに加えてollamaにも対応しています。
ただ、上記でダウンロードしたモデルを実行すると、エラーが出ます(以下の投稿と同様です)。


このため、Cline向けに調整されたモデルを使用します。

32bだと日本語で返答してくれるのですが、14bだと「日本語で返答して」といっても英語で返されます。
私、英語は得意ではありません。読むのめっちゃ遅いし、めっちゃストレス。
ということで、ローカルLLMでのAIプログラミングは断念します。

コスパのいいLLMは? → DeepSeek

Clineで使用できるLLMの中で一番コスパに優れているのはDeepSeekではないでしょうか。
開発元が中国なので、セキュリティ的に仕事で使用するのは憚られますが、個人開発であれば全然OKです。
日本語での入力、出力もバッチリです。
pythonとstreamlitを用いた画像スクレイピングソフトを作成したのですが、修正等のやりとりも含めて、完成までにかかった費用は$0.03でした。
最低金額の$2(税込$2.12(350円))をチャージしたので、あと60個は簡単なアプリが作成できますね。

DeepSeekの費用は
Cache writes price: $0.14/million tokens
Cache reads price: $0.014/million tokens
Output price: $0.28/million tokens

ちなみにClaude3.5 Sonnetは約20〜50倍
Input price: $3.00/million tokens
Cache writes price: $3.75/million tokens
Cache reads price: $0.30/million tokens
Output price: $15.00/million tokens

OpenAIのo1-miniは約20〜40倍
Input price: $3.00/million tokens
Output price: $12.00/million tokens

です。
もちろん性能差はあるのでしょうが、使用している感じではDeepSeekで困りません。
(同価格帯のGPT4o-mini(入力$0.15/1M tokens、出力$0.6/1M tokens)はちょっと性能不足感あります。)

といういことで、これからAIを使ってプログラミングをする人は、
①VScodeをインストール
②拡張機能Clineをインストール
③DeepSeekの公式サイトにログインして、$2.12払って、API取得
⑤Clineの設定からDeepSeekを設定
がコスパ最強です。ぜひお試しあれ。

いいなと思ったら応援しよう!