# Elyza-TV 100を解かせる手順 (松尾研LLM講座最終課題のコンペ評価用) llama.cpp を使って、google/gemma-2-27bをLoRAファインチューニング後にGGUF量子化したモデルで回答を生成します。 * [こちら](https://colab.research.google.com/drive/1SIZNxbyf1R8332iK8IvhhNlGhR_j9Sjt#scrollTo=pd8VbKeIQ_3J)に推論用のGoogle Colab Noteを共有しましたので、評価時の参考にしてください。 まず、GPUを利用できる形でllama.cppをビルドし直します。 ``` !CMAKE_ARGS="-DLLAMA_CUDA=on" pip install llama-cpp-python[server] ``` 必要なパッケージのインストール ``` !pip install huggingface_hub ``` 必要なライブラリのインポート ``` import os from llama_cpp import Llama from huggingface_hub import hf_hub_download ``` モデルをダウンロード ``` from google.colab import userdata os.environ['HUGGINGFACE_TOKEN'] = userdata.get('HF_TOKEN') # Download the model hf_hub_download( repo_id="hideax/gemma-2-27b-it-5-q5_k_m", filename="unsloth.Q5_K_M.gguf", local_dir="./models" ) ``` モデルをロード ``` llm = Llama( model_path="models/unsloth.Q5_K_M.gguf", flash_attn=True, n_gpu_layers=81, n_batch=1024, n_ctx=8192, ) ``` ELYZA-tasks-100-TVの読み込み ``` import json datasets = [] with open("/content//elyza-tasks-100-TV_0.jsonl", "r") as f: item = "" for line in f: line = line.strip() item += line if item.endswith("}"): datasets.append(json.loads(item)) item = "" ``` タスクの実行 ``` from tqdm import tqdm results = [] for dt in tqdm(datasets): input = dt["input"] prompt = f"""### 指示\n{input}\n### 回答\n""" output = llm( prompt, max_tokens=max_tokens, temperature=temperature, top_p=top_p, stop=stop or [], echo=False ) prediction = output["choices"][0]["text"].strip() result = {"task_id": dt["task_id"], "input": input, "output": prediction} print(result) results.append(result) ``` 結果をjsonlで保存 ``` model_id = "gemma-2-27b-it-5-Q5_K_M" with open(f"{model_id}_output.jsonl", 'w', encoding='utf-8') as f: for result in results: json.dump(result, f, ensure_ascii=False) f.write('\n') ``` # 利用したモデル - google/gemma-2-27b # ファインチューニングに利用したデータ - llm-jp/magpie-sft-v1.0 (apache-2.0 license)