ja/3_parameter_efficient_finetuning/notebooks/load_lora_adapter.ipynb (161 lines of code) (raw):

{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "z-6LLOPZouLg" }, "source": [ "# LoRAアダプタの読み込み\n", "\n", "このノートブックでは、事前学習されたモデルにLoRAアダプタを読み込む方法を示します。LoRA(低ランク適応)は、事前学習されたモデルの重みを固定し、学習可能なランク分解行列をモデルの層に注入するパラメータ効率の良い微調整技術です。" ] }, { "cell_type": "markdown", "metadata": { "id": "fXqd9BXgouLi" }, "source": [ "## 1. 開発環境のセットアップ\n", "\n", "最初のステップは、Hugging FaceライブラリとPytorchをインストールすることです。`trl`、`transformers`、`datasets`を含みます。`trl`について聞いたことがない場合でも心配ありません。これは`transformers`と`datasets`の上に構築された新しいライブラリで、微調整、RLHF、オープンLLMの調整を容易にします。\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "tKvGVxImouLi" }, "outputs": [], "source": [ "# Google Colabでの要件のインストール\n", "# !pip install transformers datasets trl huggingface_hub\n", "\n", "# Hugging Faceへの認証\n", "\n", "from huggingface_hub import login\n", "\n", "login()\n", "\n", "# 便利のため、Hugging Faceのトークンを環境変数HF_TOKENとして設定できます" ] }, { "cell_type": "markdown", "metadata": { "id": "XHUzfwpKouLk" }, "source": [ "## 2. モデルとアダプタの読み込み" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "id": "z4p6Bvo7ouLk" }, "outputs": [ { "data": { "text/plain": [ "Downloading (…)okenizer_config.json: 100%|██████████| 28.0/28.0 [00:00<00:00, 28.0kB/s]\n", "Downloading (…)lve/main/config.json: 100%|██████████| 1.11k/1.11k [00:00<00:00, 1.11MB/s]\n", "Downloading (…)olve/main/vocab.json: 100%|██████████| 1.06M/1.06M [00:00<00:00, 1.06MB/s]\n", "Downloading (…)olve/main/merges.txt: 100%|██████████| 525k/525k [00:00<00:00, 525kB/s]\n", "Downloading (…)/main/tokenizer.json: 100%|██████████| 2.13M/2.13M [00:00<00:00, 2.13MB/s]\n", "Downloading (…)/main/adapter_config.json: 100%|██████████| 472/472 [00:00<00:00, 472kB/s]\n", "Downloading (…)/adapter_model.bin: 100%|██████████| 1.22G/1.22G [00:10<00:00, 120MB/s]\n", "Downloading pytorch_model.bin: 100%|██████████| 1.22G/1.22G [00:10<00:00, 120MB/s]\n" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# モデルとアダプタの読み込み\n", "from transformers import AutoModelForCausalLM\n", "from peft import PeftModel\n", "\n", "base_model = AutoModelForCausalLM.from_pretrained(\"HuggingFaceTB/SmolLM2-135M\")\n", "peft_model_id = \"HuggingFaceTB/SmolLM2-135M-LoRA\"\n", "model = PeftModel.from_pretrained(base_model, peft_model_id)\n", "model.eval()" ] }, { "cell_type": "markdown", "metadata": { "id": "9TOhJdtsouLk" }, "source": [ "## 3. モデルのテスト\n", "\n", "モデルが正しく読み込まれたことを確認するために、いくつかのサンプル入力でテストします。" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "id": "z4p6Bvo7ouLk" }, "outputs": [ { "data": { "text/plain": [ "Downloading (…)okenizer_config.json: 100%|██████████| 28.0/28.0 [00:00<00:00, 28.0kB/s]\n", "Downloading (…)lve/main/config.json: 100%|██████████| 1.11k/1.11k [00:00<00:00, 1.11MB/s]\n", "Downloading (…)olve/main/vocab.json: 100%|██████████| 1.06M/1.06M [00:00<00:00, 1.06MB/s]\n", "Downloading (…)olve/main/merges.txt: 100%|██████████| 525k/525k [00:00<00:00, 525kB/s]\n", "Downloading (…)/main/tokenizer.json: 100%|██████████| 2.13M/2.13M [00:00<00:00, 2.13MB/s]\n" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# トークナイザーの読み込み\n", "from transformers import AutoTokenizer\n", "\n", "tokenizer = AutoTokenizer.from_pretrained(\"HuggingFaceTB/SmolLM2-135M\")\n", "\n", "# サンプル入力の生成\n", "inputs = tokenizer(\"こんにちは、元気ですか?\", return_tensors=\"pt\")\n", "outputs = model.generate(**inputs, max_new_tokens=50)\n", "print(tokenizer.decode(outputs[0], skip_special_tokens=True))" ] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": ".venv", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.10" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 0 }