catch-img

【Llama2】Code Llamaの日本語モデル | ELYZA-japanese-CodeLlama-7b

この記事では、Code Llamaの日本語学習済みモデル「ELYZA-japanese-CodeLlama-7b」の使い方について解説しています。


目次[非表示]

  1. 1.Llama2とは
  2. 2.Code Llamaとは
  3. 3.日本語学習済みモデル「ELYZA-japanese-CodeLlama-7b」
  4. 4.商用利用が可能
  5. 5.モデル一覧
  6. 6.モデルを動かすにはGPUが必要
  7. 7.実行環境
  8. 8.Jupyter Labを起動
  9. 9.ライブラリのインストール
  10. 10.モデルとトークナイザーを読み込む関数
  11. 11.モデル・トークナイザーを読み込む
  12. 12.モデルを使用してテキストを生成する関数
  13. 13.生成タスク1
    1. 13.1.プロンプト
    2. 13.2.生成結果
  14. 14.生成タスク2
    1. 14.1.プロンプト
    2. 14.2.生成結果
  15. 15.生成タスク3
    1. 15.1.プロンプト
    2. 15.2.生成結果
  16. 16.生成タスク4
    1. 16.1.プロンプト
    2. 16.2.生成結果
  17. 17.生成タスク5
    1. 17.1.プロンプト
    2. 17.2.生成結果
  18. 18.生成タスク6
    1. 18.1.プロンプト
    2. 18.2.生成結果
  19. 19.LLMならGPUクラウド
  20. 20.まとめ


Llama2とは

Llama2(Large Language Model Meta AI 2/ラマツー)とは、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モデル)

    自然言語のプロンプト(命令)からコードを生成してくれます


日本語学習済みモデル「ELYZA-japanese-CodeLlama-7b」

「ELYZA-japanese-CodeLlama-7b」は、Code LlamaをベースにELYZA社が追加事前学習を行った日本語LLMです。


パラメータ数は70億であり商用利用も可能です。Code LlamaをベースとしたファインチューニングモデルがGPT-3.5-turboやGPTに匹敵する性能を持つと言われています。


元のLlama 2の事前学習では、日本語はわずか0.1%(20億トークン)しか含まれていないため、追加で180億トークンの日本語データを事前学習させています。学習に用いたのはOSCARやWikipedia等に含まれる日本語テキストデータです。


商用利用が可能

ELYZA-japanese-CodeLlama-7bのライセンスはLLAMA 2 Community Licenseに準拠しており、Acceptable Use Policy に従う限り、研究および商業目的で利用できます。


モデル一覧

ELYZA-japanese-CodeLlama-7bのモデルには複数のバリエーションがあります。
ベースモデルの他に、ユーザーの指示に従い様々なタスクを解くために事後学習を行った「instruct」のモデルがあります。


model_id

モデルの説明

elyza/ELYZA-japanese-CodeLlama-7b

Llama2に約180億トークンの日本語テキストで追加事前学習を行ったモデル。

elyza/ELYZA-japanese-CodeLlama-7b-instruct

「elyza/ELYZA-japanese-CodeLlama-7b」に対して事後学習を行ったモデル。ユーザーの指示に従い多様なタスクを解くことができる。


モデルを動かすにはGPUが必要

ELYZA-japanese-CodeLlama-7bなどのLLMを使用する際には、大量の計算を行うためにGPUが必要です。

ELYZA-japanese-Llama-2において推論を実行する際の「GPUメモリ使用量」、「ストレージ使用量」、「使用したGPU」について、各モデルごとにまとめています。


model_id
GPUメモリ(VRAM)使用量
ストレージ使用量
使用したGPU
elyza/ELYZA-japanese-CodeLlama-7b
15.7GB
13GB
NVIDIA A100 80GB x 1
elyza/ELYZA-japanese-CodeLlama-7b-instruct
15.7GB
13GB
NVIDIA A100 80GB x 1


実行環境

この記事では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-elyza


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

localhost:8888


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

llama-codellama-elyza


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

llama-codellama-elyza


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

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer


モデルとトークナイザーを読み込む関数

HuggingFaceのTransformersを使用して、事前学習済みモデルおよびトークナイザーの関数を定義します。

トークナイザーはテキストをモデルが理解できる形式に変換する機能です。

def load_model(model_name):
    tokenizer = AutoTokenizer.from_pretrained(model_name)
    model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype="auto")
    if torch.cuda.is_available():
        model = model.to("cuda")
    return model, tokenizer


モデル・トークナイザーを読み込む

モデルとトークナイザーを読み込みます。

モデルを変更する場合は、model_idを差し替えてください。

この段階でモデルがGPUメモリにロードされますので、しばらく時間がかかります。

model_name = "elyza/ELYZA-japanese-CodeLlama-7b-instruct"
model, tokenizer = load_model(model_name)


モデルを使用してテキストを生成する関数


モデルとトークナイザーを活用して、与えられたプロンプトからテキストを生成する関数を定義します。

B_INSTとE_INSTはプロンプトの開始と終了を示し、B_SYSとE_SYSは生成されたテキストの開始と終了を指します。

また、max_new_tokens=300は生成されるテキストの最大トークン数を指定しており、必要に応じて変更できます。

def generate_text(model, tokenizer, default_system_prompt,text):
    B_INST, E_INST = "[INST]", "[/INST]"
    B_SYS, E_SYS = "<<SYS>>\n", "\n<</SYS>>\n\n"
    prompt = "{bos_token}{b_inst} {system}{prompt} {e_inst} ".format(
        bos_token=tokenizer.bos_token,
        b_inst=B_INST,
        default_system_prompt=DEFAULT_SYSTEM_PROMPT,
        system=f"{B_SYS}{DEFAULT_SYSTEM_PROMPT}{E_SYS}",
        prompt=text,
        e_inst=E_INST)

    with torch.no_grad():
        token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")
    
        output_ids = model.generate(
            token_ids.to(model.device),
            max_new_tokens=768,
            pad_token_id=tokenizer.pad_token_id,
            eos_token_id=tokenizer.eos_token_id,
            repetition_penalty=1.1
        )

    output = tokenizer.decode(output_ids.tolist()[0][token_ids.size(1):], skip_special_tokens=True)
    return output


生成タスク1

プロンプト

DEFAULT_SYSTEM_PROMPT = "あなたは優秀なプログラマーです。"
text = """
PyTorchのデータローダーの使い方を教えてください。
"""
generated_text = generate_text(model, tokenizer,DEFAULT_SYSTEM_PROMPT, text)
print(generated_text)

llama-codellama-elyza


生成結果

PyTorchのデータローダーを使用して、データセットからデータを読み込む方法について説明します。

データローダーを作成するには、以下の手順を実行します。

データセットクラスを作成します。これは、データセット内のデータを読み取り、必要に応じて変換するためのメソッドを定義するクラスです。
データセットクラスを継承したDataLoaderクラスを作成します。これは、データセットからデータを読み取り、バッチサイズごとにデータを分割するためのメソッドを定義するクラスです。
DataLoaderクラスのインスタンスを作成し、データセットからデータを読み取ります。
以下は、データセットクラスとDataLoaderクラスの例です。

```python
import torch
from torch.utils.data import Dataset, DataLoader

class MNISTDataset(Dataset):
    def init(self, data_dir):
        self.data_dir = data_dir
        self.data = pd.read_csv(os.path.join(data_dir, 'train.csv'))

    def len(self):
        return len(self.data)

    def getitem(self, idx):
        image_name = os.path.join(self.data_dir, 'images', self.data.iloc[idx]['image'])
        label = self.data.iloc[idx]['label']
        image = Image.open(image_name).convert('RGB')
        image = transforms.ToTensor()(image).unsqueeze(0)
        return image, label

train_dataset = MNISTDataset('./data')
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)


生成タスク2

プロンプト

DEFAULT_SYSTEM_PROMPT = "あなたは優秀なプログラマーです。"
text = """
PyTorchのnn.Moduleの使い方を教えてください。
"""
generated_text = generate_text(model, tokenizer,DEFAULT_SYSTEM_PROMPT, text)
print(generated_text)


生成結果

PyTorchのnn.Moduleは、ネットワーク構造を定義するために使用されます。以下は、簡単な例です。

```python
import torch
import torch.nn as nn

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(2, 3)
        self.fc2 = nn.Linear(3, 1)

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x
```
このモジュールは、入力を受け取り、2つのフルコンベクショナル・ニューラル・ネットワーク (FCNNs) を経由して出力を生成します。


生成タスク3

プロンプト

DEFAULT_SYSTEM_PROMPT = "あなたは優秀なプログラマーです。"
text = """
PyTorchのtransformsを使った前処理の方法を教えてください。
"""

generated_text = generate_text(model, tokenizer,DEFAULT_SYSTEM_PROMPT, text)
print(generated_text)


生成結果

PyTorchのtransformsモジュールを使用した画像の前処理方法を紹介します。

1. 画像データの読み込み: まず、PyTorchのtorchvisionモジュールを使用して、画像データを読み込みます。
2. トランスフォームの適用: torchvision.transformsには、画像データの前処理に利用できる様々な関数が定義されています。これらの関数をチェーン化して、必要な前処理を行うトランスフォームを作成します。例えば、次のように、画像サイズを変更したり、平均と標準偏差を0にするなどの前処理を行うトランスフォームを作成できます。
```python
import torchvision.transforms as transforms

# 画像サイズを変更し、平均と標準偏差を0にするトランスフォームを作成
transform = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])
```
3. トランスフォームの適用: トランスフォームを作成したら、それを使用して、複数の画像データを前処理します。
```python
# 画像データを前処理
image_data = transform(image_data)
```


生成タスク4

プロンプト

DEFAULT_SYSTEM_PROMPT = "あなたは優秀なプログラマーです。"
text = """
learning_rate、batch_size、epochsなどのパラメータの決め方の要領を教えてください。
"""
generated_text = generate_text(model, tokenizer,DEFAULT_SYSTEM_PROMPT, text)
print(generated_text)


生成結果

学習率やバッチサイズ、エポック数などのハイパーパラメータの調整に関しては以下のような一般的なガイドラインがあります。

学習率: 学習率は小さすぎると最適解に到達するのが遅くなり、大きすぎると最適解に到達するのが早くなります。通常、学習率は0.01から0.5の間で調整します。
バッチサイズ: バッチサイズは小さすぎると計算コストが高くなり、大きすぎるとメモリ不足になる可能性があります。通常、バッチサイズは32から256の間で調整します。
エポック数: エポック数は小さすぎると最適解に到達するのが遅くなり、大きすぎると最適解に到達するのが早くなります。通常、エポック数は10から100の間で調整します。
これらのガイドラインはあくまでも一例であり、実際のデータセットやモデルに合わせて調整する必要があります。


    生成タスク5

    プロンプト

    DEFAULT_SYSTEM_PROMPT = "あなたは優秀なプログラマーです。"
    text = """
    損失関数のMSELossとCrossEntropyLossはどのように用途に分けられますか?
    """
    generated_text = generate_text(model, tokenizer,DEFAULT_SYSTEM_PROMPT, text)
    print(generated_text)


    生成結果

    MSELossとCrossEntropyLossはいずれも損失関数ですが、その用途は異なります。
    
    MSELoss: 予測値と正解値との間にある距離を最小化します。例えば、画像の回復や自然言語処理(NLP)の文章の分類などに使われます。
    CrossEntropyLoss: 予測値と正解値との間にあるクロスエントロピー損失を最小化します。例えば、画像の分類や音声の認識などに使われます。


      生成タスク6

      プロンプト

      DEFAULT_SYSTEM_PROMPT = "あなたは優秀なプログラマーです。"
      text = """
      torch.no_grad()がモデルの推論時に使われるのはなぜですか?
      """
      generated_text = generate_text(model, tokenizer,DEFAULT_SYSTEM_PROMPT, text)
      print(generated_text)


      生成結果

      PyTorchでは、自動微分アルゴリズムを利用することで、モデルのパラメータを最適化します。その際、勾配を計算する必要があります。一方で、推論時には勾配を求める必要はありません。そのため、推論時にはwith torch.no_grad():ブロック内で実行することで、勾配の計算をスキップし、高速化することができます。


      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の日本語モデル「ELYZA-japanese-CodeLlama-7b」でコード生成をする方法を紹介しました。

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

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


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



      MORE INFORMATION

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

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