2024.06.25
Deepseek-coder-v2で無料のGitHub Copilotの実現について
1. はじめに
こんにちは、グループ研究開発本部 次世代システム研究室のT.D.Qです。今回は、DeepSeek-Coder-V2とContinue.devを使用して、無料でGitHub Copilotのようなコーディング支援環境を構築する方法をご紹介します。GitHub Copilotは有料サービスですが、オープンソースのDeepSeek-Coder-V2とContinue.devを利用することで、同様の機能を無料で実現できます。
1. DeepSeek-Coder-V2の概要
DeepSeek-Coder-V2はコードインテリジェンスの限界を押し広げる強力なオープンソース言語モデルであり、一般的な言語スキルも強力に維持しています。その性能は、多くのコーディングおよび数学ベンチマークにおいて、GPT-4 Turboなどのクローズドソースモデルに匹敵するか、あるいはそれを上回ります。
- DeepSeek-Coder-V2は、DeepSeek AIによって開発されたオープンソースのMixture-of-Experts (MoE)コード言語モデルです。
- コード特化のタスクにおいて、クローズドソースモデルであるGPT4-Turboに匹敵する性能を発揮します。
- DeepSeek-V2の中間チェックポイントからさらに6兆トークンを追加して事前学習を行い、コーディングと数学的推論能力を大幅に向上させています。
- MoEモデルは、大規模なニューラルネットワークを複数の小さなサブネットワーク(エキスパート)に分割し、各エキスパートが特定の入力データやタスクを処理するように設計されています。
- DeepSeek-Coder-33Bと比較して、コード関連タスク、推論、一般的な能力において顕著な進歩を示しています。
- 対応するプログラミング言語の数が86から338に増加し、コンテキスト長も16Kから128Kトークンに延長されています。
主要な特徴
- コード、数学、自然言語の多様なコーパスで事前学習され、総計6兆トークンに達しています。
- 対応するプログラミング言語は338種類で、DeepSeek-Coderの86種類から大幅に増加しています。
- 最大コンテキスト長は16Kから128Kトークンに延長されています。
- 16Bおよび236Bパラメータのバージョンが利用可能で、それぞれ2.4Bおよび21Bのアクティブパラメータを持ちます。
ベンチマーク結果
コーディングと数学
- DeepSeek-Coder-V2は、コード生成と数学ベンチマークにおいて最先端の性能を達成し、GPT-4 Turbo、Claude 3 Opus、Gemini 1.5 Proなどのクローズドソースモデルを上回ります。
- LiveCodeBench(コード生成を評価)では、DeepSeek-Coder-V2は74.2 Pass@1を記録し、GPT-4 Turboの71.8、Claude 3 Opusの68.2、Gemini 1.5 Proの65.7を上回ります。
- SWEbench(複雑な指示の遂行をテスト)では、DeepSeek-Coder-V2は62.8 Pass@1を記録し、GPT-4 Turboの68.5には劣るものの優れた結果を示しています。
- MATH(数学的推論を評価)では、DeepSeek-Coder-V2は89.6の正確さを達成し、GPT-4 Turboの87.9、Claude 3 Opusの85.1、Gemini 1.5 Proの83.6を上回ります。
一般言語
- DeepSeek-Coder-V2は、コーディングと数学に特化している一方で、一般的な言語能力においても優れた性能を維持しています。
- BBHやMMLU(言語理解を測定)では、DeepSeek-Coder-V2はそれぞれ83.9と79.2を記録し、DeepSeek-V2の79.7と78.1を上回ります。また、GPT-4 Turboの85.2と81.7に匹敵する性能を示しています。
2. 環境設定
今回の環境設定は、MacOS Ventura 13.5を搭載した32GBメモリ、Apple M2 ProチップのPC上で行います。
2.1 必要なツール
お使いのOSに関係なく、以下のコマンドで現在使用しているバージョンを確認してください:
python3 --version pip3 --version
Python 3.11以降およびpip 23以降がインストールされている必要があります。
次に、deepseek-coder-v2
という名前の仮想環境を作成します:
python3 -m venv deepseek-coder-v2 source deepseek-coder-v2/bin/activate # macOS/Linuxの場合
仮想環境を有効化した後、システムに影響を与えずに必要なパッケージをインストールできます。
次のコマンドを使用して、通常のユーザー権限でShellGPTとローカルLLM統合をインストールします:
pip3 install shell-gpt pip3 install 'shell-gpt[litellm]'
これにより、ユーザー用にShellGPTがインストールされ、ローカルLLM統合が設定されます。pipパッケージをroot権限でインストールすることは、OSが依存するパッケージを壊す可能性があるため推奨されません。インストール後、次のコマンドを実行してみてください:
sgpt
このコマンドが自動的に見つからない場合は、バイナリの場所をPATH変数に追加する必要があるかもしれません。その時に、pipがバイナリをどこにインストールしたかを確認できます。
pip3 show --files shell-gpt
2.2 DeepSeek-Coder-V2のインストール
Ollamaのインストール
Ollamaは、ローカルマシンでLLMを動かすことができるアプリケーションです。LinuxでDeepSeek-Coder-V2モデルをインストールして実行するには、新しいシェルを開き、次のコマンドを入力します:
curl -fsSL https://ollama.com/install.sh | sh ollama run deepseek-coder-v2
今回はDeepSeek-Coder-V2をローカルマシンでインストールする際に、16Bモデルを使用します。このモデルは約8.9GBの容量があり、ダウンロードにはネットワーク速度によって約1時間かかる場合もあります。
次に、ShellGPTをOllamaに接続するための設定を行います。最初のsgptコマンドの実行時に、OpenAIシステムを使用して自動的に作成された.sgptrcファイルを編集します:
nano ~/.config/shell_gpt/.sgptrc
以下のように対応する行を修正して、ファイルを保存します:
{ "DEFAULT_MODEL": "deepseek-coder-v2", "OPENAI_API_KEY": "not-needed", "USE_LITELLM": true, "OPENAI_USE_FUNCTIONS": false }
OllamaはAPIキーなしで動作しますが、sgptコマンドはAPIキーが提供されていない場合にエラーをスローしますので、「not-needed」という任意な文字列を設定しておきました。
2.3 Continue.dev Pluginのインストール
Continue.devは、GitHub Copilotとほぼ同じ機能を提供するオープンソースのVSCode拡張機能です。このツールを使って、VSCode内から直接Ollamaを経由してdeepseek-coder-v2モデルにアクセスし、コードの自動生成や修正を行うことができます。
Continue.devのインストール
- VSCodeを開き、拡張機能タブ(ショートカット:
Ctrl+Shift+X
)に移動します。 - 「Continue」を検索して、このプラグインをインストールします。
Continue.devにDeepSeek-Coder-V2を追加する
- インストール後、左側のサイドバーにあるContinueのアイコンをクリックして、Continueのインターフェースを開きます。
- 右下の歯車アイコンをクリックして、設定ファイル
config.json
を開きます。
設定ファイルconfig.json
に以下のコードを変更します。
{ "title": "DeepSeek-coder-v2", "model": "deepseek-coder-v2", "provider": "ollama", "completionOptions": {}, "apiKey": "sk-1234567890abcdef" }, "tabAutocompleteModel": { "title": "DeepSeek-coder-v2", "provider": "ollama", "model": "deepseek-coder-v2" }
設定ファイルconfig.json
は通常、$HOME/.continue/config.json
にあります。VSCodeから直接編集することができます。
- 設定ファイルを保存し、VSCodeに戻ります。DeepSeek-Coder-V2が追加され、使用可能な状態になります。
3. 設定の検証
Deepseek-coder-v2を検証するため、Pygameを用いたスネークゲームを生成するタスクを依頼しましょう。
VSCode上で、Continueプラグインを使ってPygameを用いたスネークゲームを生成するプロンプトを入力します。生成されたゲームコードは以下の通りです。
import pygame import random # ゲーム画面の設定 WIDTH = 800 HEIGHT = 600 FPS = 10 # 色の定義 WHITE = (255, 255, 255) BLACK = (0, 0, 0) GREEN = (0, 255, 0) RED = (255, 0, 0) # Pygameの初期化 pygame.init() screen = pygame.display.set_mode((WIDTH, HEIGHT)) clock = pygame.time.Clock() # スネークのクラス定義 class Snake: def __init__(self): self.size = 1 self.elements = [(int(WIDTH / 2), int(HEIGHT / 2))] self.dx = 0 self.dy = 0 def move(self): head = (self.elements[0][0] + self.dx, self.elements[0][1] + self.dy) self.elements.insert(0, head) if len(self.elements) > self.size: self.elements.pop() def add_segment(self): self.size += 1 # 食べ物のクラス定義 class Food: def __init__(self): self.position = (random.randint(0, WIDTH - 10) // 10 * 10, random.randint(0, HEIGHT - 10) // 10 * 10) def respawn(self): self.position = (random.randint(0, WIDTH - 10) // 10 * 10, random.randint(0, HEIGHT - 10) // 10 * 10) # ゲームのメインループ snake = Snake() food = Food() running = True game_over = False score = 0 while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.KEYDOWN: if not game_over: if event.key == pygame.K_UP and snake.dy == 0: snake.dx = 0 snake.dy = -10 elif event.key == pygame.K_DOWN and snake.dy == 0: snake.dx = 0 snake.dy = 10 elif event.key == pygame.K_LEFT and snake.dx == 0: snake.dx = -10 snake.dy = 0 elif event.key == pygame.K_RIGHT and snake.dx == 0: snake.dx = 10 snake.dy = 0 else: if event.key == pygame.K_RETURN: game_over = False score = 0 snake = Snake() food = Food() if not game_over: screen.fill(BLACK) for segment in snake.elements: pygame.draw.rect(screen, GREEN, (segment[0], segment[1], 10, 10)) pygame.draw.rect(screen, RED, (food.position[0], food.position[1], 10, 10)) snake.move() if snake.elements[0] == food.position: snake.add_segment() score += 1 food.respawn() for segment in snake.elements[1:]: if segment == snake.elements[0]: continue if segment[0] == snake.elements[0][0] and segment[1] == snake.elements[0][1]: game_over = True pygame.draw.rect(screen, WHITE, (0, 0, WIDTH, HEIGHT), 1) font = pygame.font.Font(None, 36) text = font.render("Score: " + str(score), True, WHITE) screen.blit(text, (10, 10)) else: font = pygame.font.Font(None, 72) text = font.render("Game Over", True, RED) screen.blit(text, (WIDTH // 2 - 130, HEIGHT // 2 - 36)) text = font.render("Press Enter to Restart", True, WHITE) screen.blit(text, (WIDTH // 2 - 190, HEIGHT // 2 + 36)) pygame.display.update() clock.tick(FPS) pygame.quit()
Continueプラグインで生成されたこのコードは、スムーズに動作し、クラシックなスネークゲームを実現しています。以下のコマンドを使用して実行します:
python deepseek_coder_snake.py
以下は、実行中のゲームの動画です:
4. 性能評価
4.1 コード生成能力
DeepSeek-Coder-V2は、優れたコード生成能力を持っています。Pygameを使用したスネークゲームのコード生成テストにおいて、DeepSeek-Coder-V2は正確かつ効率的なコードを生成し、モデルの高い理解力と適応性を示しました。他のソースコード生成課題を試したところでも、正確で質の高い成果物を得られ、その性能に驚きました。
4.2 応答速度
DeepSeek-Coder-V2の応答速度も優れています。ローカルマシン上での実行において、最初のコード生成には20〜30秒程度かかることがありますが、これはマシンの構成が強力でないため、GPUを使用していないことが原因です。しかし、その後のコード生成は連続的に高速に行われ、生成されるコードの品質も高いです。GitHub Copilotと比較して待ち時間が20秒前後遅いと感じましたが、DeepSeek-Coder-V2の応答速度は悪くないレベルであり、無料ソリューションとして非常に満足のいくパフォーマンスを発揮します。
4.3 使いやすさ
DeepSeek-Coder-V2は、その直感的なインターフェースとVSCodeとのスムーズな統合により、非常に使いやすいです。Continue.devプラグインとの組み合わせで簡単にセットアップでき、コーディングの生産性を大幅に向上させることができます。GitHub Copilotの代替として、優れた選択肢となります。
5. まとめ
DeepSeek-Coder-V2は、非常に優れたオープンソースのコード言語モデルであり、GPT-4 Turboや他のクローズドソースモデルを凌駕する性能を持っています。高いコード生成能力、迅速な応答速度、使いやすいインターフェースにより、開発者にとって価値のあるツールです。
6. 参考文献とリンク
7. 宣伝
次世代システム研究室では、最新のテクノロジーを調査・検証しながら、様々なインターネットアプリケーションの開発を行うアーキテクトを募集しています。興味のある方は、こちらからご応募ください。
グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。
Follow @GMO_RD