CodeLlamaはMetaが開発した「コード生成特化型」のLLMです。
Llama 2がベースになっています。
CodeLlamaをファインチューニングしたモデルは、GPT-4の性能を上回るという報告もあります。
CodeLlamaには3種類のモデルがあります。
- Code Llama … 基本のモデル。コードを補完する。
- Code Llama – Python … Python特化モデル。コードを補完する。
- Code Llama – Instruct … 自然言語の指示に従ってコードを生成するモデル
それぞれのモデルに7B、13B、34Bのパラメータを持つバージョンがあります。
この記事ではCodeLlamaをWindows11で動かす方法を紹介します。
※Llama 2をWindowsで動かす方法は「すぐできる!Llama 2をWindowsのローカル環境で使う方法」をご覧ください。
実行環境
この記事では以下の環境で動作を確認しました。
- Python 3.10.9
- Windows 11 Home
- llama-cpp-python 0.1.78
前提
CodeLlamaのモデルを利用するためにLlama.cppを使います。
Llama.cppはC言語で実装されたLlamaの実行環境でMacOS、Linux、WindowsのいずれのOSでもLlamaを動かすことができる優れものです。
C言語で実装されているため高速で動作し、GPUがないマシンでも動作します。
CodeLlamaのダウンロード
はじめにHugging FaceのページからCodeLlamaの7Bモデルをダウンロードします。
Llama.cppを使うためGGML形式のモデルを選びます。
ダウンロードしたらわかりやすいフォルダに置いておきましょう。
ここではCドライブ直下に「CodeLlama」というフォルダを作ってその中に入れました。
必要なライブラリをインストールする
次にLlama.cppのPython版のライブラリをインストールします。
pipでインストールできます。
pip install llama-cpp-python
すでに「llama-cpp-python」をインストール済みの場合は、最新版にアップデートします。
※llama-cpp-pythonのバージョンが0.1.80の場合にAssertionErrorが発生し動作しませんでした。以下のバージョンでは動作しました。
pip install -U llama-cpp-python==0.1.78
参考: https://github.com/abetlen/llama-cpp-python/issues/643
CodeLlamaを使う
あとはPythonでコードを書いて実行するだけです。
今回は以下のコードを用意しました。
プロンプト部分(prompt)とmodel_pathは自分の環境に合わせて書き換えてください。
from llama_cpp import Llama
prompt ='def generate_fibonacci(n):\n' # フィボナッチ数列を生成する関数を補完させる
llm = Llama(model_path="C:\CodeLlama\codellama-7b.ggmlv3.Q3_K_M.bin")
output = llm(
prompt,
max_tokens=500,
echo=False
)
print(output['choices'][0]['text'])
ここではフィボナッチ数列を生成するPythonコードを補完させています。
CodeLlamaの基本モデルはコードを補完するモデルなので、プロンプトを関数の書き出しにしています。
先ほどモデルを配置したフォルダに、上記のコードをexample.pyという名前で保存します。
コマンドプロンプトでこれを実行すると、以下のような回答が得られます。
def generate_fibonacci(n): # プロンプト
if n == 0
return 0
if n == 1
return 1
fibs = []
i = 0
while len(fibs) < n + 1:
if len(fibs) <= 2:
fib_value = 1
else:
new_value = fibs[i] + fibs[i - 1]
i += 1
fib_value = new_value
fibs.append(fib_value)
return fibs[-1]
今回使用した基本モデル(7B)では、精度が悪く無駄な改行が出力されたり「:」が抜けているなど、問題のあるコードが生成されました。
7Bでは使い物にはならなそうです。13Bでも試して比較してみましょう。
CodeLlama 13B を試す
基本モデルのパラメータ数を増やした13Bモデルでも試してみます。
上記のモデルをダウンロードした後、同じ場所に配置して、以下のようにコードを書きかえます。
from llama_cpp import Llama
prompt ='def generate_fibonacci(n):\n' # フィボナッチ数列を生成する関数を補完させる
llm = Llama(model_path="c:\CodeLlama\codellama-13b.ggmlv3.Q5_K_M.bin")
output = llm(
prompt,
max_tokens=1000
)
print(output['choices'][0]['text'])
出力が以下です。
無駄な改行がなくなって、ぱっと見はきれいなコードになりました。
def generate_fibonacci(n): # プロンプト
if n == 0:
return []
# Base case
if n == 1:
return [1]
prev = 1
current = 2
output = [prev, current]
for _ in range(n-2)):
temp_next = prev + current
prev = current
current = temp_next
return output
ただし、依然としてコードは正しくありません。
プロンプトの改良も試みましたが、実用的ではなさそうでした。
Code Llama – Pythonを試す
続いてPythonに特化したコード生成モデルである Code Llama – Python を試してみます。
モデルが変わるだけでやることはこれまでと同じです。
以下のようなPythonコードを書きます。
from llama_cpp import Llama
prompt ='def generate_fibonacci(n):\n'
llm = Llama(model_path="c:\CodeLlama\codellama-13b-python.ggmlv3.Q5_K_M.bin")
output = llm(
prompt,
max_tokens=500
)
print(output['choices'][0]['text'])
出力は以下のようになりました。
Python特化のモデルを使った場合でも、13Bモデルでは微妙な結果でした。
def generate_fibonacci(n): # プロンプト
a = 0
b = 1
while a < n:
print(a, end=','))
(c) 200.
)
(
a
,
b
=
a
+
b
)
print(b, end=','))
(c) 200.
Code Llama – Instructを試す
最後にCode Llama – Instructも試しておきます。
こちらはコードを補完するモデルではなく、自然言語の指示に従ってコードを生成するモデルです。
モデルに合わせてプロンプトを書き換えます。
from llama_cpp import Llama
prompt ='Generate the Fibonacci Sequence in Python' # フィボナッチ数列を生成させる
llm = Llama(model_path="c:\CodeLlama\codellama-13b-instruct.ggmlv3.Q5_K_M.bin")
output = llm(
prompt,
max_tokens=1000
)
print(output['choices'][0]['text'])
指示モデルでも13Bではコード生成はうまくいかず、英文の説明のみが出力されました。
def generate_fibonacci(n): # プロンプト
The Fibonacci sequence is a sequence of numbers where each number is the sum of the two preceding numbers: 1, 1, 2, 3, 5, ... Starting with zero as its first two terms and extending it to include all positive integers as its term. It has many interesting properties such as the relationship between the sum of the squares of any two consecutive terms in the sequence with the square of the sum of those same terms which is also equal to the square of the difference between those two consecutive terms in the sequence.
まとめ
この記事ではCodeLlamaをWindowsで動かす方法を解説しました。
CodeLlamaのコード生成の品質は7B~13Bのモデルでは実用的に使えるものではなさそうでしたが、34Bモデルやファインチューニング済みのモデルであれば、よい結果になるかもしれません。
今後試していきます。
記事の内容にわからないことがある方は以下のアカウントに気軽にDMしてください!
また、最新の技術の活用方法など役に立つツイートを心がけているので、ぜひフォローしてもらえると嬉しいです!