, inference_mode=False, r=8, target_modules={'gate_proj', 'v_proj', 'down_proj', 'o_proj', 'up_proj', 'k_proj', 'q_proj'}, lora_alpha=32, lora_dropout=0.1, fan_in_fan_out=False, bias='none', use_rslora=False, modules_to_save=None, init_lora_weights=True, layers_to_transform=None, layers_pattern=None, rank_pattern={}, alpha_pattern={}, megatron_config=None, megatron_core='megatron.core', loftq_config={}, use_dora=False, layer_replication=None, runtime_config=LoraRuntimeConfig(ephemeral_gpu_offload=False))"
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model = get_peft_model(model, config)\n",
+ "config"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "id": "bdadeda7-40c7-4d13-bb10-2342f2589b59",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "trainable params: 20,185,088 || all params: 7,635,801,600 || trainable%: 0.2643\n"
+ ]
+ }
+ ],
+ "source": [
+ "model.print_trainable_parameters()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f1bcf2d8-27ba-46e7-afc3-0af4564f0bcd",
+ "metadata": {},
+ "source": [
+ "# 配置训练参数"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "id": "f2ebb791-793f-43c4-95a1-25b5d5e0b070",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "args = TrainingArguments(\n",
+ " output_dir=\"./output/Qwen2.5-Coder-7B-Instruct\",\n",
+ " per_device_train_batch_size=4,\n",
+ " gradient_accumulation_steps=4,\n",
+ " logging_steps=10,\n",
+ " num_train_epochs=3,\n",
+ " save_steps=10, # 为了快速演示,这里设置10,建议你设置成100\n",
+ " learning_rate=1e-4,\n",
+ " save_on_each_node=True,\n",
+ " gradient_checkpointing=True\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "id": "9daa30c2-752c-49db-888a-af48baaa434e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "trainer = Trainer(\n",
+ " model=model,\n",
+ " args=args,\n",
+ " train_dataset=tokenized_id,\n",
+ " data_collator=DataCollatorForSeq2Seq(tokenizer=tokenizer, padding=True),\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "id": "d051dc78-00a8-4d89-aa36-7ed70b5bf71b",
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`...\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ "
\n",
+ " [699/699 23:35, Epoch 2/3]\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | Step | \n",
+ " Training Loss | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 10 | \n",
+ " 3.968300 | \n",
+ "
\n",
+ " \n",
+ " | 20 | \n",
+ " 3.456000 | \n",
+ "
\n",
+ " \n",
+ " | 30 | \n",
+ " 3.343800 | \n",
+ "
\n",
+ " \n",
+ " | 40 | \n",
+ " 3.229300 | \n",
+ "
\n",
+ " \n",
+ " | 50 | \n",
+ " 3.239300 | \n",
+ "
\n",
+ " \n",
+ " | 60 | \n",
+ " 3.198400 | \n",
+ "
\n",
+ " \n",
+ " | 70 | \n",
+ " 3.202300 | \n",
+ "
\n",
+ " \n",
+ " | 80 | \n",
+ " 3.261800 | \n",
+ "
\n",
+ " \n",
+ " | 90 | \n",
+ " 3.303900 | \n",
+ "
\n",
+ " \n",
+ " | 100 | \n",
+ " 3.208000 | \n",
+ "
\n",
+ " \n",
+ " | 110 | \n",
+ " 3.207700 | \n",
+ "
\n",
+ " \n",
+ " | 120 | \n",
+ " 3.209000 | \n",
+ "
\n",
+ " \n",
+ " | 130 | \n",
+ " 3.126500 | \n",
+ "
\n",
+ " \n",
+ " | 140 | \n",
+ " 3.127100 | \n",
+ "
\n",
+ " \n",
+ " | 150 | \n",
+ " 3.195700 | \n",
+ "
\n",
+ " \n",
+ " | 160 | \n",
+ " 3.172500 | \n",
+ "
\n",
+ " \n",
+ " | 170 | \n",
+ " 3.143400 | \n",
+ "
\n",
+ " \n",
+ " | 180 | \n",
+ " 3.092800 | \n",
+ "
\n",
+ " \n",
+ " | 190 | \n",
+ " 3.088900 | \n",
+ "
\n",
+ " \n",
+ " | 200 | \n",
+ " 3.083900 | \n",
+ "
\n",
+ " \n",
+ " | 210 | \n",
+ " 3.070200 | \n",
+ "
\n",
+ " \n",
+ " | 220 | \n",
+ " 3.062300 | \n",
+ "
\n",
+ " \n",
+ " | 230 | \n",
+ " 3.113700 | \n",
+ "
\n",
+ " \n",
+ " | 240 | \n",
+ " 3.393000 | \n",
+ "
\n",
+ " \n",
+ " | 250 | \n",
+ " 2.783600 | \n",
+ "
\n",
+ " \n",
+ " | 260 | \n",
+ " 2.682300 | \n",
+ "
\n",
+ " \n",
+ " | 270 | \n",
+ " 2.778900 | \n",
+ "
\n",
+ " \n",
+ " | 280 | \n",
+ " 2.802900 | \n",
+ "
\n",
+ " \n",
+ " | 290 | \n",
+ " 2.798200 | \n",
+ "
\n",
+ " \n",
+ " | 300 | \n",
+ " 2.679400 | \n",
+ "
\n",
+ " \n",
+ " | 310 | \n",
+ " 2.679900 | \n",
+ "
\n",
+ " \n",
+ " | 320 | \n",
+ " 2.698100 | \n",
+ "
\n",
+ " \n",
+ " | 330 | \n",
+ " 2.751100 | \n",
+ "
\n",
+ " \n",
+ " | 340 | \n",
+ " 2.765400 | \n",
+ "
\n",
+ " \n",
+ " | 350 | \n",
+ " 2.768200 | \n",
+ "
\n",
+ " \n",
+ " | 360 | \n",
+ " 2.715900 | \n",
+ "
\n",
+ " \n",
+ " | 370 | \n",
+ " 2.709400 | \n",
+ "
\n",
+ " \n",
+ " | 380 | \n",
+ " 2.795400 | \n",
+ "
\n",
+ " \n",
+ " | 390 | \n",
+ " 2.670100 | \n",
+ "
\n",
+ " \n",
+ " | 400 | \n",
+ " 2.608800 | \n",
+ "
\n",
+ " \n",
+ " | 410 | \n",
+ " 2.795300 | \n",
+ "
\n",
+ " \n",
+ " | 420 | \n",
+ " 2.679900 | \n",
+ "
\n",
+ " \n",
+ " | 430 | \n",
+ " 2.775000 | \n",
+ "
\n",
+ " \n",
+ " | 440 | \n",
+ " 2.684300 | \n",
+ "
\n",
+ " \n",
+ " | 450 | \n",
+ " 2.634800 | \n",
+ "
\n",
+ " \n",
+ " | 460 | \n",
+ " 2.697600 | \n",
+ "
\n",
+ " \n",
+ " | 470 | \n",
+ " 2.634500 | \n",
+ "
\n",
+ " \n",
+ " | 480 | \n",
+ " 2.363200 | \n",
+ "
\n",
+ " \n",
+ " | 490 | \n",
+ " 2.281900 | \n",
+ "
\n",
+ " \n",
+ " | 500 | \n",
+ " 2.294300 | \n",
+ "
\n",
+ " \n",
+ " | 510 | \n",
+ " 2.185200 | \n",
+ "
\n",
+ " \n",
+ " | 520 | \n",
+ " 2.302200 | \n",
+ "
\n",
+ " \n",
+ " | 530 | \n",
+ " 2.258700 | \n",
+ "
\n",
+ " \n",
+ " | 540 | \n",
+ " 2.351600 | \n",
+ "
\n",
+ " \n",
+ " | 550 | \n",
+ " 2.430900 | \n",
+ "
\n",
+ " \n",
+ " | 560 | \n",
+ " 2.360900 | \n",
+ "
\n",
+ " \n",
+ " | 570 | \n",
+ " 2.356000 | \n",
+ "
\n",
+ " \n",
+ " | 580 | \n",
+ " 2.145100 | \n",
+ "
\n",
+ " \n",
+ " | 590 | \n",
+ " 2.343300 | \n",
+ "
\n",
+ " \n",
+ " | 600 | \n",
+ " 2.179200 | \n",
+ "
\n",
+ " \n",
+ " | 610 | \n",
+ " 2.300300 | \n",
+ "
\n",
+ " \n",
+ " | 620 | \n",
+ " 2.259300 | \n",
+ "
\n",
+ " \n",
+ " | 630 | \n",
+ " 2.329900 | \n",
+ "
\n",
+ " \n",
+ " | 640 | \n",
+ " 2.309000 | \n",
+ "
\n",
+ " \n",
+ " | 650 | \n",
+ " 2.242900 | \n",
+ "
\n",
+ " \n",
+ " | 660 | \n",
+ " 2.310000 | \n",
+ "
\n",
+ " \n",
+ " | 670 | \n",
+ " 2.378500 | \n",
+ "
\n",
+ " \n",
+ " | 680 | \n",
+ " 2.170900 | \n",
+ "
\n",
+ " \n",
+ " | 690 | \n",
+ " 2.234300 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ "TrainOutput(global_step=699, training_loss=2.7544531378793784, metrics={'train_runtime': 1418.2557, 'train_samples_per_second': 7.888, 'train_steps_per_second': 0.493, 'total_flos': 4.575963998146867e+16, 'train_loss': 2.7544531378793784, 'epoch': 2.996784565916399})"
+ ]
+ },
+ "execution_count": 19,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "trainer.train()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0814a560-1e42-4ced-99e6-de9648f8bfd8",
+ "metadata": {},
+ "source": [
+ "# 合并加载模型"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "7219bb51-66fa-4dae-bf5a-997382c220df",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "b8588305bba14213ada7ca70dac68f5f",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Loading checkpoint shards: 0%| | 0/4 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "我是甄嬛,家父是大理寺少卿甄远道。\n"
+ ]
+ }
+ ],
+ "source": [
+ "from transformers import AutoModelForCausalLM, AutoTokenizer\n",
+ "import torch\n",
+ "from peft import PeftModel\n",
+ "\n",
+ "mode_path = '/root/autodl-tmp/Qwen/Qwen2.5-Coder-7B-Instruct/'\n",
+ "lora_path = '/root/output/Qwen2.5-Coder-7B-Instruct/checkpoint-690/' # 这里改称你的 lora 输出对应 checkpoint 地址\n",
+ "\n",
+ "# 加载tokenizer\n",
+ "tokenizer = AutoTokenizer.from_pretrained(mode_path, trust_remote_code=True)\n",
+ "\n",
+ "# 加载模型\n",
+ "model = AutoModelForCausalLM.from_pretrained(mode_path, device_map=\"auto\",torch_dtype=torch.bfloat16, trust_remote_code=True).eval()\n",
+ "\n",
+ "# 加载lora权重\n",
+ "model = PeftModel.from_pretrained(model, model_id=lora_path)\n",
+ "\n",
+ "prompt = \"你是谁?\"\n",
+ "inputs = tokenizer.apply_chat_template([{\"role\": \"user\", \"content\": \"假设你是皇帝身边的女人--甄嬛。\"},{\"role\": \"user\", \"content\": prompt}],\n",
+ " add_generation_prompt=True,\n",
+ " tokenize=True,\n",
+ " return_tensors=\"pt\",\n",
+ " return_dict=True\n",
+ " ).to('cuda')\n",
+ "\n",
+ "\n",
+ "gen_kwargs = {\"max_length\": 2500, \"do_sample\": True, \"top_k\": 1}\n",
+ "with torch.no_grad():\n",
+ " outputs = model.generate(**inputs, **gen_kwargs)\n",
+ " outputs = outputs[:, inputs['input_ids'].shape[1]:]\n",
+ " print(tokenizer.decode(outputs[0], skip_special_tokens=True))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "aac6cd05-b62b-465a-8ecf-0678adc7297c",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "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.10.8"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}