コード生成AI「WizardCoder」をローカルで動かしてみた

コード生成AI「WizardCoder」をローカルで動かしてみた

Noppy

Noppy

テクノロジー部ののっぴーです。

今回は少しでも効率よく業務を進めるために、最近流行りのコード生成AIを導入し、コーディングの自動化や品質の向上を目指してみようと思います。

なお、今回は課金が必要なサービスは使いません。OSSのAIモデルをローカルで動かせるよう環境を構築しようと思います。

利用モデル

今回はWizardCoder-15B-1.0-GPTQを利用します。

WizardCoder-15B-1.0-GPTQとは、2023年6月16日に公開されたコード生成AIモデルWizardCoder-15B-v1.0のGPTQ版(CUDA特化モデル)です。Evol-Instruct法を用いることで、HumanEvalなどのベンチマークスコア比でBard(Google)等より性能が良いのだそう(詳細はこちらの記事を参照ください)。

なお、2023年8月26日に公開されたCode LlamaベースのWizardCoder-Python-34B-V1.0などとは別物のようです。

今回のゴール

VSCodeでコード生成AIが使えるようにすることを目指します。そのため、Text generation web UIのようなWEBから利用する環境の作成はおこないません。

WizardCoderでVSCodeの拡張を探すと、mzbac(Anchen)さんが作成した拡張が見つかりました。仕組みとしてはバックエンドとしてGPTQモデルとのやり取りをする(Text generation web UIのJSON版のような)WEB APIを起動しておき、VSCode拡張でそのAPIにアクセスするようです。

VSCodeで動かす環境を自作するとしても同じようなものを作ることになると思うので、今回はこのVSCode拡張を動かすことを目指します。

環境

これから構築する環境を含め、各ソフト・ライブラリ・PATH等のバージョンなどは以下の通りです。

項目
OS Windows 11 Pro
Python 3.10.11
PyTorch 2.0.1+cu118
GPU GeForce RTX 3060Ti
CUDA toolkit 11.8
PowerShell 7.3.6 (ver.7である必要はない)
プロジェクトフォルダ ~/ws/wizardcoder

構築の手順

基本的にはAutoGPTQ-APIのREADME.mdに書かれている通りに、各ライブラリなどをインストールしていけば問題ありません。

今回はWindowsでの構築手順を説明しますが、LinuxでもPython、C++コンパイラ、CUDA toolkitのインストール以外はほとんど同じ手順となります。
※MacではGPTQ版ではなく、GGML(GGUF)版のモデルで同様のことをおこなえば実現可能だと思いますが、この記事ではMac対応については触れていません。

Pythonのインストール

WindowsにはデフォルトでPythonがインストールされていません。まずはPythonを使えるようにしましょう。

今回はwingetでインストールします。wingetとは、Linuxでいうaptやdnf(yum)のようにパッケージを管理するMicrosoft謹製のパッケージマネージャです。PATHはインストール時に自動で通してくれます。

# python 3.10 インストール
winget install Python.Python.3.10

# コマンドが使えるかチェック
python -V

CUDA toolkitのインストール

後にインストールするPyTorchとの対応の都合で、最新版のv12.2ではなく、v11.8をインストールします。

▼v11.8のダウンロードはこちら
https://developer.nvidia.com/cuda-11-8-0-download-archive

▼最新版をインストールしたい場合はこちら
https://developer.nvidia.com/cuda-downloads

使用許諾に同意。

インストールオプションはお好みで選択。

「Visual Studioもダウンロードしてください」という注意喚起に同意。

インストールを待ちます。

「次へ」をクリック。

これでインストール完了です。

VC++コンパイラのインストール

AutoGPTQの依存ライブラリで、C++コンパイラが必要です。これはwingetではインストールできないようで、Visual Studio Installer経由で導入します(面倒ですが……)。

# Visual Studio Installerのインストール
winget install Microsoft.VisualStudio.2022.BuildTools

インストールが完了したらVisual Studio Installerを開き、Visual Studio Build Tools 2022をインストールします。

その後、Pathを通せばコンパイラcl.exeが利用できるようになります。

自分の場合はC:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.37.32822\bin\Hostx64\x64にインストールされていたのでここのPathを通しました。

AutoGPTQ-API

APIサーバーのリポジトリをクローンしておきましょう。

cd ~/ws/
git clone https://github.com/mzbac/AutoGPTQ-API

Python仮想環境作成

pipで環境を汚したくないので、依存ライブラリをインストールする前に仮想環境を作成します。AutoGPTQ-APIのREADMEではcondaを利用していましたが、自分はvenv派なので、そちらで仮想環境を作成しました。

cd ~/ws/AutoGPTQ-API

# 仮想環境作成 (ここでは環境名を'wizardcoder'としているが、名前は何でもよい)
python -m venv wizardcoder

# 仮想環境のアクティベート
./wizardcoder/Scripts/activate

PyTorchのインストール

今回はPyTorchの公式のインストール手順に従いました。AutoGPTQ-APIのREADMEの通りにおこなっても、大差ないと思います。

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

# pytorch 動作確認
python -c "import torch; print(torch.rand(5,3))"
    # tensor([[0.6774, 0.9547, 0.4302],
    #         [0.5855, 0.6856, 0.5201],
    #         [0.8636, 0.3622, 0.4221],
    #         [0.6969, 0.4361, 0.8257],
    #         [0.6005, 0.6954, 0.8251]])


PyTorchでCUDAが利用できることも確認します。

AutoGPTQ-APIのインストール

AutoGPTQ-APを、READMEの通りにインストールします。

# AutoGPTQのインストール
pip install auto-gptq

# AutoGPTQ-APIの依存ライブラリのインストール
# VC++コンパイラをインストールしていないとcchardetのインストールで `Microsoft Visual C++ 14.0 or greater is required.` と怒られる
pip install -r requirements.txt

SSL自己証明書はOpenSSLのインストールが面倒だったので、WSL(Linux)上で作成してコピーしました。

# Linux仮想環境起動
wsl

# SSL自己証明書の作成
openssl req -x509 -out cert.pem -keyout key.pem \
  -newkey rsa:2048 -nodes -sha256 \
  -subj '/CN=localhost' -extensions EXT -config <( \
   printf "[dn]\nCN=localhost\n<pre>[code]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")

# windowsのフォルダにコピー
cp *.pem /mnt/c/Users/USER_NAME/ws/AutoGPTQ-API

WizardCoder-15B-1.0-GPTQモデルのダウンロードをおこないます(download.py経由ではなく、Hugging Faceから直接DLしてもよいです)。

python download.py TheBloke/WizardCoder-15B-1.0-GPTQ

blocking_api.pyの修正

AutoGPTQ-APIに記載の情報は若干古いようで、quantize_configのパラメタ指定方法が変更されています。

現在ではquantize_config.jsonで設定するようになったそうなので、quantize_config引数部分を修正しました。

model = AutoGPTQForCausalLM.from_quantized(model_name_or_path,
        use_safetensors=True,
        device=DEV,
        use_triton=use_triton,
-        quantize_config=quantize_config)
+        quantize_config=None)

VSCodeにwizardcoder-vscのインストールと設定

wizardcoder-vsc拡張をインストールし、AutoGPTQ-APIのエンドポイントを設定します。今回はデフォルトの設定値のまま(2023-09-04_01h22_30)にしています。

AutoGPTQ-APIサーバーを起動

READMEどおりにサーバーを起動します。なお、WindowsではCtrl+Cをトラップできてないようで停止できず、停止するにはプロセスをKILLする必要がありました。

python blocking_api.py

VSCodeからWizardCoderを動かせるか試す

以上で準備ができたので、早速試してみましょう。

APIに直接質問をリクエストしてみる

まずはREADME通りにAPIに直接プロンプトを送信し、結果を確認してみます。

# bash等で実行する場合は curl.exe -> curl に変更してください
curl.exe -k -s -X POST https://localhost:5000/api/v1/generate -H "Content-Type: application/json" -d '{"prompt": "Below is an instruction that describes a task. Write a response that appropriately completes the request\n### Instruction: write a for loop in typescript\n### Response:", "max_length": 1000, "temperature": 0.7}'

その結果……

markdown
Here's an example of a for loop in TypeScript:

```typescript
for (let i = 0; i < 5; i++) {
console.log(i);
}
```

This loop initializes a variable `i` to 0, then checks if it is less than 5. If it is, it logs the current value of `i` to the console using `console.log()`. After each iteration of the loop, it increments `i` by 1 using the `++` operator.

You can also use the `for...of` syntax to iterate over arrays and other iterable objects:

```typescript
const myArray = [1, 2, 3, 4, 5];

for (const element of myArray) {
console.log(element);
}
```

This loop will iterate over each element of the `myArray` array and log it to

しっかり回答が返ってきました。

VSCode (wizardcoder-vsc) で質問してみる

次に、VSCodeのwizardcoder-vsc拡張から質問してみます。

wizardcoder-vscではCtrl+Shift+P →Chat with Wizard Coder でプロンプトの入力ダイアログが出るので、質問を入力します。しばらくするとサイドバーのWizard Coderビューに回答が返ってきます。

ソースコードの選択した範囲に関して質問してみる

ソースコードを選択した範囲に関しての質問をすることも可能です。下記の手順で質問を行います。

  1. AIに質問したいコードの部分を選択
  2. Ctrl+Shift+P →Chat with Wizard Coder でプロンプトの入力ダイアログを表示
  3. 質問を入力

Text generation web UIと比べていちいちコピー&ペーストをしなくてよいため、既存コードに関する質問を何度もする場合はとても楽です。

一方で、APIでリクエストパラメタとして指定できていたtemperatureなどは、wizardcoder-vscでは指定できません。変更したい場合はAPIサーバー側(blocking_api.py)のデフォルト値を変更しましょう。

まとめ

AutoGPTQ-APIとwizardcoder-vscを導入し、VSCodeからWizardCoderを動かすことができました。

ローカルでコード生成AIの環境を完結できるのはよかったのですが、手持ちのGPUではやや時間がかかり、有料のクラウド型コード生成AIと比べると使い勝手は劣る感じです(性能のいいGPUだともっと早く回答が得られるようですが、個人向けGPUだと340億パラメータあたりを動かすのが限界のようです)。

今回はAutoGPTQ-APIのREADME通りにWizardCoder-15B-1.0-GPTQモデルを利用しましたが、AutoGPTQ-API自体はText generation web UI互換とのこと。ソースコードを見た感じだと別のモデルへの差し替えも簡単にできるようでしたので、興味のある方はそちらも試してみるとよいでしょう。

最新情報をメルマガでお届けします!

LIGブログではAIやアプリ・システム開発など、テクノロジーに関するお役立ち記事をお届けするメルマガを配信しています。

<お届けするテーマ>
  • 開発プロジェクトを円滑に進めるためのTIPS
  • エンジニアの生産性が上がった取り組み事例
  • 現場メンバーが生成AIを使ってみた
  • 開発ツールの使い方や開発事例の解説
  • AIをテーマにしたセミナーの案内
  • 最新のAI関連ニュースまとめ など

「AIに関する最新情報を集めたい!」「開発ツールの解説や現場の取り組みを知りたい!」とお考えの方は、ぜひお気軽に無料のメルマガをご購読くださいませ。

購読する(無料)

この記事のシェア数

2011年からスマホ向けゲーム会社のWEBエンジニアとして課金システムなどの開発に従事。その後インフラエンジニア、フルスタックエンジニアとして経験を積み、2022年にLIGに入社。現在はTD兼エンジニアとして上流から下流・保守までを一貫して担当。

このメンバーの記事をもっと読む
10年以上の開発実績があるLIGが、最適な開発体制や見積もりをご提案します
相談する サービス概要を見る