File size: 5,610 Bytes
8f09d06 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 |
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "MljifiTVCT0_"
},
"source": [
"# 推論用コード\n",
"本コードはunslothで学習したqLoRAのアダプタを用いてELYZA-tasks-100-TVの出力を得るためのコードです。 \n",
"Hugging Faceにアダプタをアップロードしてあることが前提となります。\n",
"このコードはunslothライブラリを用いてモデルを読み込み、推論するためのコードとなります。\n",
"このコードで生成されたjsonlファイルは課題の成果として提出可能なフォーマットになっております。\n",
"\n",
"※本コードはGoogle Colabでの動作を想定しており、Omnicampusでの動作を想定しておりません。\n",
"Omnicampus向けのコードは別途用意しております。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "I5B5MOHuBy8b"
},
"outputs": [],
"source": [
"# 必要なライブラリをインストール\n",
"%%capture\n",
"!pip install unsloth\n",
"!pip uninstall unsloth -y && pip install --upgrade --no-cache-dir \"unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git\"\n",
"!pip install -U torch\n",
"!pip install -U peft"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "GM7SNRtACg9V"
},
"outputs": [],
"source": [
"# 必要なライブラリを読み込み\n",
"from unsloth import FastLanguageModel\n",
"from peft import PeftModel\n",
"import torch\n",
"import json\n",
"from tqdm import tqdm\n",
"import re"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "JmdUATTVCtyr"
},
"outputs": [],
"source": [
"# ベースとなるモデルと学習したLoRAのアダプタ(Hugging FaceのIDを指定)。\n",
"model_id = \"llm-jp/llm-jp-3-13b\"\n",
"adapter_id = \"\""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Hugging Face Token を指定。\n",
"# 下記の URL から Hugging Face Token を取得できますので下記の HF_TOKEN に入れてください。\n",
"# https://huggingface.co/settings/tokens \n",
"HF_TOKEN = \"\" #@param {type:\"string\"}"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "TB6Hzx-2B5g8"
},
"outputs": [],
"source": [
"# unslothのFastLanguageModelで元のモデルをロード。\n",
"dtype = None # Noneにしておけば自動で設定\n",
"load_in_4bit = True # 今回は13Bモデルを扱うためTrue\n",
"\n",
"model, tokenizer = FastLanguageModel.from_pretrained(\n",
" model_name=model_id,\n",
" dtype=dtype,\n",
" load_in_4bit=load_in_4bit,\n",
" trust_remote_code=True,\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# 元のモデルにLoRAのアダプタを統合。\n",
"model = PeftModel.from_pretrained(model, adapter_id, token = HF_TOKEN)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "fg_yURyiB8o6"
},
"outputs": [],
"source": [
"# タスクとなるデータの読み込み。\n",
"# 事前にデータをアップロードしてください。\n",
"datasets = []\n",
"with open(\"./elyza-tasks-100-TV_0.jsonl\", \"r\") as f:\n",
" item = \"\"\n",
" for line in f:\n",
" line = line.strip()\n",
" item += line\n",
" if item.endswith(\"}\"):\n",
" datasets.append(json.loads(item))\n",
" item = \"\""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "TwfZEra1CEJo"
},
"outputs": [],
"source": [
"# モデルを用いてタスクの推論。\n",
"\n",
"# 推論するためにモデルのモードを変更\n",
"FastLanguageModel.for_inference(model)\n",
"\n",
"results = []\n",
"for dt in tqdm(datasets):\n",
" input = dt[\"input\"]\n",
"\n",
" prompt = f\"\"\"### 指示\\n{input}\\n### 回答\\n\"\"\"\n",
"\n",
" inputs = tokenizer([prompt], return_tensors = \"pt\").to(model.device)\n",
"\n",
" outputs = model.generate(**inputs, max_new_tokens = 512, use_cache = True, do_sample=False, repetition_penalty=1.2)\n",
" prediction = tokenizer.decode(outputs[0], skip_special_tokens=True).split('\\n### 回答')[-1]\n",
"\n",
" results.append({\"task_id\": dt[\"task_id\"], \"input\": input, \"output\": prediction})"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "voAPnXp5CKRL"
},
"outputs": [],
"source": [
"# 結果をjsonlで保存。\n",
"\n",
"# ここではadapter_idを元にファイル名を決定しているが、ファイル名は任意で問題なし。\n",
"json_file_id = re.sub(\".*/\", \"\", adapter_id)\n",
"with open(f\"/content/{json_file_id}_output.jsonl\", 'w', encoding='utf-8') as f:\n",
" for result in results:\n",
" json.dump(result, f, ensure_ascii=False)\n",
" f.write('\\n')"
]
}
],
"metadata": {
"colab": {
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
},
"language_info": {
"name": "python"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
|