catch-img

【Llama2】コード生成Code Llamaの使い方 | 7B・13B・34B

この記事では、Code Llamaによるコード生成をする方法(推論)について紹介しています。


目次[非表示]

  1. 1.Llama2とは
  2. 2.Code Llamaとは
  3. 3.Code Llamaのモデル一覧
  4. 4.Metaへのモデル利用申請とHuggingFaceの設定
  5. 5.実行環境
  6. 6.Jupyter Labを起動
  7. 7.ライブラリのインストール
  8. 8.モデルの設定
  9. 9.モデルの量子化
  10. 10.モデルとトークナイザーの読み込み
  11. 11.コード補完のタスク(Code Completion)
    1. 11.1.入力したプロンプト
    2. 11.2.生成結果
  12. 12.コードの穴埋めタスク(Code Infilling)
    1. 12.1.入力したプロンプト
    2. 12.2.生成結果
  13. 13.命令タスク(Instructモデル)
    1. 13.1.入力したプロンプト
    2. 13.2.生成結果
  14. 14.生成AI・LLMならGPUクラウド
  15. 15.まとめ


Llama2とは

Llama2(ラマツー)とは、Facebookを運営するMeta社が開発した言語生成AI(LLM)で、OpenAI社のChatGPTに匹敵する性能を持っています。


Llama2の特徴としては、軽量モデルで高性能、そして無料で使えるオープンソースであるため、開発者にとって扱いやすいモデルになっています。

llama2


Llama2の詳細については、以下の記事で解説しています。


  Llama2とは?使い方・日本語性能・商用利用について解説 | 初心者ガイド この記事では、Llama2について幅広く解説しています。Llama2の性能や安全性、商用利用、日本語対応、様々な環境での使い方などに触れています。 業界最安級GPUクラウド | GPUSOROBAN


Code Llamaとは

Code LlamaはMetaが既に公開している言語モデルの「Llama 2」をベースに、プログラムコードの自動生成に特化させたモデルです。

Llama 2モデルをベースに、500Bトークン(≒5000億単語)のプログラムに特化させた学習データを使っています。


Code Llamaでできることは3つあります。

  1. コード補完のタスク(Code Completion)

    途中まで書いたプログラムの続きをCode Llamaが完成させてくれます。

  2. コードの穴埋めタスク(Code Infilling)
    Code Llamaがコードの途中の穴埋めをしてくれます。

  3. 命令タスク(Instructモデル)
    自然言語のプロンプト(命令)からコードを生成してくれます。


Code Llamaのモデル一覧

ベースモデルの「Code Llama」、Pythonに特化した「Code Llama-Python」、命令タスクに特化した「Code Llama - Instruct」の3種類あり、それぞれ異なるパラメータ数の7B(70億)、13B(130億)、34B(340億)が用意されています。


モデル名

特徴

GPUメモリ(VRAM)使用量
※4bit量子化を設定

ストレージ使用量

使用したGPU

CodeLlama-7b-hf

ベースモデル、70億パラメータ

6.1GB

13GB

NVIDIA A4000 16GB x 1

CodeLlama-13b-hf

ベースモデル、130億パラメータ

9.8GB

25GB

NVIDIA A4000 16GB x 1

CodeLlama-34b-hf

ベースモデル、340億パラメータ

21.7GB

63GB

NVIDIA A100 80GB x 1

CodeLlama-7b-Python-hf

Python特化 、70億パラメータ

6.1GB

13GB

NVIDIA A4000 16GB x 1

CodeLlama-13b-Python-hf

Python特化 、130億パラメータ

9.7GB

25GB

NVIDIA A4000 16GB x 1

CodeLlama-34b-Python-hf

Python特化 、340億パラメータ

21.7GB

63GB

NVIDIA A100 80GB x 1

CodeLlama-7b-Instruct-hf

命令タスク、70億パラメータ

6.1GB

13GB

NVIDIA A4000 16GB x 1

CodeLlama-13b-Instruct-hf

命令タスク、130億パラメータ

9.6GB

25GB

NVIDIA A4000 16GB x 1

CodeLlama-34b-Instruct-hf

命令タスク、340億パラメータ

21.7GB

63GB

NVIDIA A100 80GB x 1


上記のGPUメモリは、モデルを4bit量子化して精度を低下させる代わりに、モデルサイズを軽量化した場合のものです。

HuggingFaceの記事によるとファインチューニングなどでモデル量子化を使用しない場合は、パラメータ数に応じて以下のGPUメモリが必要になります。


パラメータ数

GPUメモリ(VRAM)

ロードする精度

7b(70億パラメータ)のモデル

14GB

bfloat16

13b(130億パラメータ)のモデル

26GB

bfloat16

34b(130億パラメータ)のモデル

68GB

bfloat16


またGithubでは、パラメータが大きいモデルではマルチGPUを推奨しています。

  • 13BパラメータのモデルでGPU x 2(=MP2)
  • 34BパラメータのモデルでGPU x 4(=MP4)


Metaへのモデル利用申請とHuggingFaceの設定

Llama2を利用する前に、Meta社へのモデル利用の申請とHuggingFaceの設定の準備を行います。

設定が完了したら、HuggingFaceのアクセストークンを後で使いますので、メモしておきます。

Metaへのモデル利用申請・HuggingFaceの設定方法について、以下の記事で詳しく解説しています。

※Code Llamaの場合はHuggingFaceでのモデルの利用申請は必要ありません

  【Llama2】Meta・HuggingFaceへの利用申請 この記事では、Llama2を使用するためのMeta・HuggingFaceへの利用申請について解説しています。 業界最安級GPUクラウド | GPUSOROBAN


実行環境

この記事ではGPUクラウドサービス(GPUSOROBAN)を使用しました。

  • インスタンス名:t80-1-a-exlarge-ubs22-i
  • GPU:NVIDIA A100 80GB x 1
  • OS :Ubuntu 22.04
  • CUDA:11.7
  • Jupyter Labプリインストール

GPUSOROBANはメガクラウドの50%以上安いGPUクラウドサービスです。

GPUSOROBANの使い方は以下の記事で解説しています。


  会員登録~インスタンス接続手順 | GPUSOROBAN GPUSOROBANの会員登録からインスタンス作成・接続までの手順を詳しく解説する記事です。会員登録、電話番号認証、SSHキー作成、インスタンスの作成、キーの設置、ターミナルからのインスタンス接続までの流れを説明しています。 業界最安級GPUクラウド | GPUSOROBAN


Jupyter Labを起動

GPUSOROBANのインスタンスに接続したら、次のコマンドを実行し、Jupyter Labを起動します。

jupyter lab --ip='*' --port=8888 --NotebookApp.token='' --NotebookApp.password='' --no-browser

llama-codellama


ブラウザの検索窓に"localhost:8888"を入力すると、Jupyter Labをブラウザで表示できます。

localhost:8888


Jupyter Labのホーム画面で[Python3 ipykernel]を選択し、Notebookを開きます。

llama-codellama


Jupyter Labの使い方が分からない方は、以下の記事が参考になります。


プリインストールされたJupyter Labを使用する場合は、以下の記事をご覧ください。


  プリインストールの利用方法(Docker、PyTorch、TensorFlow、JupyterLab)| GPUSOROBAN GPUSOROBAN高速コンピューティングのプリインストールの利用方法を説明しています。PyTorchやTensosrFlow、JupyterLabがプリインストールされたインスタンスを使うことで環境構築にかかる時間を削減できます。 業界最安級GPUクラウド | GPUSOROBAN



Jupyter Labを新しくインストールして使う場合は、以下の記事をご覧ください。


  Jupyter Labのインストール(Ubuntu)| GPUSOROBAN GPUSOROBANのUbuntuインスタンスにJupyter Labをインストールする方法を紹介しています。高性能なGPUインスタンスを利用したクラウドサービスGPUSOROBANでJupyter Labを動作させることが可能です。 業界最安級GPUクラウド | GPUSOROBAN


ライブラリのインストール

Jupyterのコードセルで以下のコマンドを実行し、必要なライブラリをインストールします。

pip install transformers sentencepiece accelerate bitsandbytes scipy protobuf


必要なライブラリをインポートします。

import torch
from torch import cuda,bfloat16
import transformers
from transformers import AutoTokenizer,AutoModelForCausalLM


モデルの設定

HuggingFaceのtransformersというライブラリを使用してモデルの準備をします。

HuggingFaceで利用申請したLlamaのモデルを読み込みます。

model_id = "codellama/CodeLlama-34b-Instruct-hf"


この記事ではCodeLlama-34b-Instruct-hfのパラメータ34bのチャットモデルを使用していますが、他のモデルを使いたい場合は表を参考に適宜model_idを変更してください。


モデル名
特徴
GPUメモリ(VRAM)使用量 ※4bit量子化を設定
ストレージ使用量
使用したGPU
CodeLlama-7b-hf
ベースモデル、70億パラメータ
6.1GB
13GB
NVIDIA A4000 16GB x 1
CodeLlama-13b-hf
ベースモデル、130億パラメータ
9.8GB
25GB
NVIDIA A4000 16GB x 1
CodeLlama-34b-hf
ベースモデル、340億パラメータ
21.7GB
63GB
NVIDIA A100 80GB x 1
CodeLlama-7b-Python-hf
Python特化 、70億パラメータ
6.1GB
13GB
NVIDIA A4000 16GB x 1
CodeLlama-13b-Python-hf
Python特化 、130億パラメータ
9.7GB
25GB
NVIDIA A4000 16GB x 1
CodeLlama-34b-Python-hf
Python特化 、340億パラメータ
21.7GB
63GB
NVIDIA A100 80GB x 1
CodeLlama-7b-Instruct-hf
命令タスク、70億パラメータ
6.1GB
13GB
NVIDIA A4000 16GB x 1
CodeLlama-13b-Instruct-hf
命令タスク、130億パラメータ
9.6GB
25GB
NVIDIA A4000 16GB x 1
CodeLlama-34b-Instruct-hf
命令タスク、340億パラメータ
21.7GB
63GB
NVIDIA A100 80GB x 1


モデルの量子化

モデルの量子化の設定を行います。

量子化は、モデルのパラメータや活性化関数などを低bitに変換する技術で、モデルサイズを小さくすることができGPUメモリの使用量を節約できます。

quant_config = transformers.BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type='nf4',
    bnb_4bit_use_double_quant=True,
    bnb_4bit_compute_dtype=bfloat16
)


モデルとトークナイザーの読み込み

モデルの設定情報を読み込みます。

model_config = transformers.AutoConfig.from_pretrained(model_id)


この記事では、モデルのパラメータを4bitでロードするように設定し、4bitの計算に使用されるデータ型を float16 に設定しています。

モデルを読み込みます。初回はモデルをダウンロードするため時間がかかりますが、
2回目以降はモデルの読み込みのみになりますので、すぐに完了します。

model = transformers.AutoModelForCausalLM.from_pretrained(
    model_id,
    trust_remote_code=True,
    quantization_config=quant_config,
    device_map="auto"
)


モデルに対応したトークナイザーを読み込みます。

tokenizer = AutoTokenizer.from_pretrained(model_id)


transformers ライブラリの pipeline 関数を使用して、テキスト生成のためのパイプラインを構築します。

pipeline = transformers.pipeline(
task="text-generation",
model=model,
tokenizer=tokenizer
)


コード補完のタスク(Code Completion)

promptに、機械学習モデルのトレーニングを実行するためのコードを途中まで記述して、続きのコード補完を生成してみます。

max_lengthで生成するトークン数を調整できます。


入力したプロンプト

prompt = """
def train_epoch(model, optimizer, criterion, dataloader, device):
"""
sequences = pipeline(
    prompt,
    do_sample=True,
    temperature=0.2,
    top_p=0.95,
    num_return_sequences=1,
    eos_token_id=tokenizer.eos_token_id,
    max_length=300,
)
for seq in sequences:
    print(f"Result: {seq['generated_text']}")


生成結果

生成結果では、コードの続きをうまく補完できています。

Result: 
def train_epoch(model, optimizer, criterion, dataloader, device):
    model.train()
    total_loss = 0
    for batch_idx, (data, target) in enumerate(dataloader):
        data, target = data.to(device), target.to(device)
        optimizer.zero_grad()
        output = model(data)
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()
        total_loss += loss.item()
    return total_loss / len(dataloader)
def test_epoch(model, criterion, dataloader, device):
    model.eval()
    total_loss = 0
    with torch.no_grad():
        for batch_idx, (data, target) in enumerate(dataloader):
            data, target = data.to(device), target.to(device)
            output = model(data)
            loss = criterion(output, target)
            total_loss += loss.item()
    return total_loss / len(dataloader)
def train_model(model, optimizer, criterion, dataloader, device, epochs=10):
    for epoch in range


コードの穴埋めタスク(Code Infilling)

sklearnのコード途中を<FILL_ME>でブランクして、穴埋めをするタスクを実行してみます。

入力したプロンプト

prompt = '''
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
import numpy as np
data = np.loadtxt('data.csv', delimiter=',')
X = data[:,0].reshape(-1, 1)
y = data[:,1]
        
""" <FILL_ME>
mse = mean_squared_error(y_test, y_pred)
print(f'Mean Squared Error: {mse:.4f}')
'''
input_ids = tokenizer(prompt, return_tensors="pt")["input_ids"].to("cuda")
generated_ids = model.generate(input_ids, max_new_tokens=128)
filling = tokenizer.batch_decode(generated_ids[:, input_ids.shape[1]:], skip_special_tokens=True)[0]
print(prompt.replace("<FILL_ME>", filling))


生成結果

生成結果では適切に穴埋めができています。

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
import numpy as np
data = np.loadtxt('data.csv', delimiter=',')
X = data[:,0].reshape(-1, 1)
y = data[:,1]
        
""" Split data into training and testing sets """
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
""" Fit model on training data """
model = LinearRegression()
model.fit(X_train, y_train)
""" Predict on test data """
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f'Mean Squared Error: {mse:.4f}')


命令タスク(Instructモデル)

Pythonのbeautiful Soupを使ったスクレイピングのコードを生成するプロンプトを入力してコードを生成します。

入力したプロンプト

system = "Provide answers in Python"
user = """Generate Python code to extract text from a website using Beautiful Soup.
Include handling for different parsers (html.parser or lxml) and use requests library for fetching the website.
Ensure that the extracted text is cleaned by removing newlines and extra spaces.
"""
prompt = f"<s><<SYS>>\n{system}\n<</SYS>>\n\n{user}"

sequences = pipeline(
    prompt,
    do_sample=True,
    temperature=0.2,
    top_p=0.95,
    num_return_sequences=1,
    eos_token_id=tokenizer.eos_token_id,
    max_length=300,
)
for seq in sequences:
    print(f"Result: {seq['generated_text']}")


生成結果

生成結果では、適切にBeautifuSoupの記述ができています。

import requests
from bs4 import BeautifulSoup

def get_text(url, parser):
    response = requests.get(url)
    soup = BeautifulSoup(response.content, parser)
    text = soup.get_text()
    text = text.replace('\n','')
    text =''.join(text.split())
    return text

def main():
    url = 'https://www.example.com'
    parser = 'html.parser'
    text = get_text(url, parser)
    print(text)

if name == 'main':
    main()


生成AI・LLMならGPUクラウド

Llama2やその他のLLMを使用する際には、モデルサイズやタスクに応じて必要なスペックが異なります。
LLMで使用されるGPUは高価なため、買い切りのオンプレミスよりも、コストパフォーマンスが高く柔軟な使い方ができるGPUクラウドをおすすめしています。
GPUクラウドのメリットは以下の通りです。


  • 必要なときだけ利用して、コストを最小限に抑えられる
  • タスクに応じてGPUサーバーを変更できる
  • 需要に応じてGPUサーバーを増減できる
  • 簡単に環境構築ができ、すぐに開発をスタートできる
  • 新しいGPUを利用できるため、陳腐化による買い替えが不要
  • GPUサーバーの高電力や熱を管理をするための設備投資が不要


コスパをお求めなら、メガクラウドと比較して50%以上安いGPUクラウドサービス「GPUSOROBAN」がおすすめです。


  生成AIに最適なGPUクラウド「高速コンピューティング」|GPUSOROBAN GPUSOROBANの高速コンピューティングは、NVIDIAの高速GPUが業界最安級で使えるクラウドサービスです。NVIDIA A100を始めする高速GPUにより、画像生成AI、大規模言語モデルLLM、機械学習、シミュレーションを高速化します。 業界最安級GPUクラウド | GPUSOROBAN



まとめ

この記事では、プログラム生成に特化したCode Llamaでコード生成をする方法を紹介しました。

Llama2は無料で使えて商用利用可能な利便性の高いモデルでありながら、ChatGPTと同等以上の性能があります。

Llama2に関する詳細な情報は、以下の記事でまとめて紹介していますので、あわせてご覧ください。


  Llama2とは?使い方・日本語性能・商用利用について解説 | 初心者ガイド この記事では、Llama2について幅広く解説しています。Llama2の性能や安全性、商用利用、日本語対応、様々な環境での使い方などに触れています。 業界最安級GPUクラウド | GPUSOROBAN



MORE INFORMATION

GPUでお困りの方はGPUSOROBANで解決!
お気軽にご相談ください

10日間無料トライアル
詳しい資料はこちら
質問・相談はこちら