File size: 17,090 Bytes
434004a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div align=\"center\">\n",
    "  <img src=\"https://user-images.githubusercontent.com/11793384/215372703-4385f66a-abe4-44c7-9626-96b7b65270c8.png\" width=\"40%\" height=\"40%\" />\n",
    "</div>\n",
    "\n",
    "<center><font face=\"微软雅黑\" size=5> <b>【飞桨黑客松-AIGC - DreamBooth LoRA】This is my HomeTown</b></font></center> \n",
    "\n",
    "<br>\n",
    "\n",
    "<center>🔥🔥🔥 前往官网了解题目详情、报名、冲大奖、玩创意!👉👉👉 <a href=\"https://github.com/PaddlePaddle/Paddle/issues/50631#task105\">https://github.com/PaddlePaddle/Paddle/issues/50631#task105</a> </center>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. 背景介绍\n",
    "\n",
    "<h2> <center>紫金花海</center>\n",
    "   <br>\n",
    "   <center>The Purple Flower Sea</center> \n",
    "   <br>\n",
    "   <left> <font size=\"2\">紫金苑景区,金昌市民习惯称为“紫金花海”,位于金昌市区的北部,新华路街道天津路与泰安路交叉口北150米,总面积有700多亩。是按照景城一体化理念打造的香草花卉生态休闲旅游景区。</font></left>\n",
    "</h2>\n",
    "\n",
    "![](https://ai-studio-static-online.cdn.bcebos.com/ebc26abd8a7949139e19167ccc9aae6d39709727b1b9448f82fafde6adfcf4f5)\n",
    "\n",
    "<center> \n",
    "   <font size=\"2\">\n",
    "    \n",
    "    微风袭来\n",
    "    荡漾起的紫色“海浪”映入眼帘\n",
    "    沁人心脾的清香\n",
    "    淡淡地飘过每个角落\n",
    "    小憩在花海旁\n",
    "    倾听着花的物语\n",
    "    骑着单车\n",
    "    穿梭在紫色海洋\n",
    "    掠过小湖\n",
    "    静静享受紫色连波的浪漫\n",
    "    走过小桥\n",
    "    感受着紫色田园的美好\n",
    "\n",
    "![#pic_center](https://ai-studio-static-online.cdn.bcebos.com/e20c7bbeb85349058fab2ad7c4a8718df4461d0a9a8b4bc8bb0ed6b3bd561db1)\n",
    "       \n",
    " <center>\n",
    "     <font size=\"2\">\n",
    "         \n",
    "         被花海围绕的湖边\n",
    "         倒映出一张张欢乐的笑脸\n",
    "         穿过小小的别墅庄园\n",
    "         来到充满爱意的婚礼广场\n",
    "         浪漫而惬意的气氛\n",
    "         像是走进了童话世界\n",
    "         蜜蜂在“海浪”中辛勤游荡\n",
    "         蝴蝶在“海浪”中嬉戏打闹\n",
    "         小鸟在“海浪”中合奏吟唱\n",
    "         人儿在“海浪”中忘记烦恼\n",
    "         一个个穿梭在“海浪”的身影\n",
    "         仿佛都在诉说着这别致的一切\n",
    "\n",
    " ![](https://ai-studio-static-online.cdn.bcebos.com/5b2415cf91a24d1583c0108cd528c89b7bdb8ca4218c4c0f9999f6cc2542f0ab)\n",
    " \n",
    " <center> \n",
    "     <font size=\"2\">\n",
    "         \n",
    "         迎着初秋的微风\n",
    "         远离城市的喧嚣\n",
    "         游荡在这梦幻浪漫的紫色海洋\n",
    "         把一切的不开心都遗忘\n",
    "         欢迎大家来紫色小城游玩噢~\n",
    "![](https://ai-studio-static-online.cdn.bcebos.com/ef94e24c6cd9482ab169e03b96c5883618f9d5fde7f746dc884cf6bc86504244)\n",
    "          "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. 准备工作 \n",
    "## 2.1 环境安装 \n",
    "    \n",
    "```sh\n",
    "pip install \"paddlenlp>=2.5.2\" \"ppdiffusers>=0.11.1\" safetensors --user\n",
    "```\n",
    "</font>\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [],
   "source": [
    "# 请运行这里安装所需要的依赖环境!!\n",
    "!pip install \"paddlenlp==2.5.2\" safetensors \"ppdiffusers>=0.11.1\" --user"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.2 [Hugging Face Space](https://huggingface.co/) 注册和登录 \n",
    "\n",
    "题目要求将模型上传到 Hugging Face,需要先注册、登录。\n",
    "\n",
    "* <font face=\"微软雅黑\" size=3>**注册和登录:https://huggingface.co/join** </font>\n",
    "    <div align=\"center\">\n",
    "      <img src=\"https://ai-studio-static-online.cdn.bcebos.com/fa96268f8d0047fa8ad25b678fb209631ebe08c463884378bdd268fdc025a808\" width=\"40%\" height=\"40%\" />\n",
    "    </div> \n",
    "* <font face=\"微软雅黑\" size=3>**获取登录 Token**</font>\n",
    "    <div align=\"center\">\n",
    "      <img src=\"https://ai-studio-static-online.cdn.bcebos.com/5cd101321369427ca94d685ad082779084243fe6839f49bc8b173478a8eaf03c\" width=\"40%\" height=\"40%\" />\n",
    "      <img src=\"https://ai-studio-static-online.cdn.bcebos.com/7df3372db6f94ba2bdb636ee4a23c74bf2e05ef5a6e849c4b2e5fb3d4e3679e1\" width=\"40%\" height=\"40%\" />\n",
    "      <img src=\"https://ai-studio-static-online.cdn.bcebos.com/ebc309852fba4ae6b799d519d196b5eee76bf21682db4cb8852e01d6ae6f0602\" width=\"40%\" height=\"40%\" />    \n",
    "    </div> \n",
    "\n",
    "* <font face=\"微软雅黑\" size=3>**Aistudio 登录 Huggingface Hub**</font>\n",
    "    <div align=\"center\">\n",
    "      <img src=\"https://ai-studio-static-online.cdn.bcebos.com/d9e2c88b9a8d43f08f7379f4c8bef35c81992475e98b4c958f337f02b8174b56\" width=\"40%\" height=\"40%\" />\n",
    "    </div> \n",
    "    \n",
    "Tips:为了方便我们之后上传权重,我们需要登录 Huggingface Hub,想要了解更多的信息我们可以查阅 [官方文档](https://huggingface.co/docs/huggingface_hub/quick-start)。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-03-11T05:39:13.575730Z",
     "iopub.status.busy": "2023-03-11T05:39:13.575259Z",
     "iopub.status.idle": "2023-03-11T05:39:14.194481Z",
     "shell.execute_reply": "2023-03-11T05:39:14.193575Z",
     "shell.execute_reply.started": "2023-03-11T05:39:13.575699Z"
    },
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "b5d6b75aa009457784dcba9d1597d9c3",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "VBox(children=(HTML(value='<center> <img\\nsrc=https://huggingface.co/front/assets/huggingface_logo-noborder.sv…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 登录 Huggingface Hub\n",
    "!git config --global credential.helper store\n",
    "from huggingface_hub import login\n",
    "login()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- tips:如何检测是否登录成功?\n",
    "\n",
    "打开日志控制控制台,查看日志。\n",
    "\n",
    "![](https://ai-studio-static-online.cdn.bcebos.com/6bdaeac42a7a462fb0d08446f0f0144206d903f36e1047de8bf1b4bda5e8f94e)\n",
    "\n",
    "登录成功时,日志如下:\n",
    "\n",
    "![](https://ai-studio-static-online.cdn.bcebos.com/c193dab68ec24af8bcca15fd28535af9a52227fbb9474dc184a4eb8c7c5cfa35)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. 如何训练模型,并上传到HF\n",
    "\n",
    "## 3.1 上传图片\n",
    "* <font face=\"微软雅黑\" size=3>首先,我们需要将所需训练的图片上传到aistudio上的文件夹, 我们可以通过👉**拖拽上传** 的方式,将我们所需的图片上传至指定的文件夹。</font>\n",
    "* <font face=\"微软雅黑\" size=3>在这里,我们已经在👉**hometown**文件夹准备好了如下所示的5张图片。</font>\n",
    "![](https://ai-studio-static-online.cdn.bcebos.com/cb72e87e227b4da18b6a0eba01da507ab055bcaa30904c1382e0878c781c043b)\n",
    "![](https://ai-studio-static-online.cdn.bcebos.com/6a0f4b223b2747c7af9e4d98129f65b2328c90036c3c479f92febab318db6028)\n",
    "![](https://ai-studio-static-online.cdn.bcebos.com/f8a2589d91834d24b4e05cbc0c01fd41f67ea102f6f4462eb34080eabf8a455f)\n",
    "![](https://ai-studio-static-online.cdn.bcebos.com/60ee699e7ee344dab55c5bed6f2901c9c0bc176db47941cebf82860a4eeab01b)\n",
    "![](https://ai-studio-static-online.cdn.bcebos.com/b3e37a3182434966ae83d8e82fdd55df96e5b1c945bf41edad808a4d36cb327b)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.2 训练参数调整\n",
    "\n",
    "<font face=\"微软雅黑\" size=3> 在训练过程中,我们可以尝试修改训练的默认参数,下面将从三个方面介绍部分参数。\n",
    "\n",
    "👉主要修改的参数:\n",
    "> * **pretrained_model_name_or_path** :想要训练的模型名称或者本地路径的模型,例如:`\"runwayml/stable-diffusion-v1-5\"`,更多模型可参考 [PaddleNLP 文档](https://github.com/PaddlePaddle/PaddleNLP/tree/develop/ppdiffusers#ppdiffusers%E6%A8%A1%E5%9E%8B%E6%94%AF%E6%8C%81%E7%9A%84%E6%9D%83%E9%87%8D)。\n",
    "> * **instance_data_dir**:训练图片所在的文件夹目录,我们可以将图片上传至aistudio项目。\n",
    "> * **instance_prompt**:训练所使用的 `Prompt` 文本。\n",
    "> * **resolution**:训练时图像的分辨率,建议为 `512`。\n",
    "> * **output_dir**:训练过程中,模型保存的目录。\n",
    "> * **checkpointing_steps**:每隔多少步保存模型,默认为`100`步。\n",
    "> * **learning_rate**:训练使用的学习率,当我使用 `LoRA` 训练模型的时候,我们需要使用更大的学习率,因此我们这里使用 `1e-4` 而不是 `2e-6`。\n",
    "> * **max_train_steps**:最大训练的步数,默认为`500`步。\n",
    "    \n",
    "👉可选修改的参数:\n",
    "> * **train_batch_size**:训练时候使用的 `batch_size`,当我们的GPU显存比较大的时候可以加大这个值,默认值为`4`。\n",
    "> * **gradient_accumulation_steps**:梯度累积的步数,当我们GPU显存比较小的时候还想模拟大的训练批次,我们可以适当增加梯度累积的步数,默认值为`1`。\n",
    "> * **seed**:随机种子,设置后可以复现训练结果。\n",
    "> * **lora_rank**:`LoRA` 层的 `rank` 值,默认值为4,最终我们会得到 **3.5MB** 的模型,我们可以适当修改这个值,如:`32、64、128、256` 等。\n",
    "> * **lr_scheduler**:学习率衰减策略,可以是`\"linear\", \"constant\", \"cosine\"`等。\n",
    "> * **lr_warmup_steps**:学习率衰减前,`warmup` 到最大学习率所需要的步数。\n",
    "    \n",
    "👉训练过程中评估使用的参数:\n",
    "> * **num_validation_images**:训练的过程中,我们希望返回多少张图片,默认值为`4`张图片。\n",
    "> * **validation_prompt**:训练的过程中我们会评估训练的怎么样,因此我们需要设置评估使用的 `prompt` 文本。\n",
    "> * **validation_steps**:每隔多少个 `steps` 评估模型,我们可以查看训练的进度条,知道当前到了第几个 `steps`。\n",
    "    \n",
    "🔥**Tips:**\n",
    "    训练过程中会每隔 `validation_steps` 将生成的图片保存到 `{你指定的输出路径}/validation_images/{步数}.jpg`\n",
    "\n",
    "<div align=\"center\">\n",
    "  <img src=\"https://ai-studio-static-online.cdn.bcebos.com/86ab5ed4a31f4cf1a4b9ba1c52ccc94e2731c711dff6420eb3745f718431cb29\" width=\"40%\" height=\"40%\" />\n",
    "</div> \n",
    "    \n",
    "👉权重上传的参数:\n",
    "> * **push_to_hub**: 是否将模型上传到 `huggingface hub`,默认值为 `False`。\n",
    "> * **hub_token**: 上传到 `huggingface hub` 所需要使用的 `token`,如果我们已经登录了,那么我们就无需填写。\n",
    "> * **hub_model_id**: 上传到 `huggingface hub` 的模型库名称, 如果为 `None` 的话表示我们将使用 `output_dir` 的名称作为模型库名称。\n",
    "\n",
    "在下面的例子中,由于我们前面已经登录了,因此我们可以开启 **push_to_hub** 按钮,将最终训练好的模型同步上传到 `huggingface.co`\n",
    "    \n",
    "当我们开启`push_to_hub`后,等待程序运行完毕后会自动将权重上传到这个路径 https://huggingface.co/{你的用户名}/{你指定的输出路径} ,例如: https://huggingface.co/peteli/hometown\n",
    "</font>\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [],
   "source": [
    "!python train_dreambooth_lora.py \\\n",
    "  --pretrained_model_name_or_path=\"runwayml/stable-diffusion-v1-5\"  \\\n",
    "  --instance_data_dir=\"./hometown\" \\\n",
    "  --output_dir=\"lora_outputs\" \\\n",
    "  --instance_prompt=\"a sea of purple and gold flowers\" \\\n",
    "  --resolution=512 \\\n",
    "  --train_batch_size=1 \\\n",
    "  --gradient_accumulation_steps=1 \\\n",
    "  --checkpointing_steps=100 \\\n",
    "  --learning_rate=1e-4 \\\n",
    "  --lr_scheduler=\"constant\" \\\n",
    "  --lr_warmup_steps=0 \\\n",
    "  --max_train_steps=1000 \\\n",
    "  --seed=0 \\\n",
    "  --lora_rank=4 \\\n",
    "  --push_to_hub=False \\\n",
    "  --validation_prompt=\"a sea of lavender and gold flowers in the world of fairy tales is my hometown\" \\\n",
    "  --validation_steps=100 \\\n",
    "  --num_validation_images=4"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.3 可视化训练过程\n",
    "\n",
    "VisualDL使用参考:[官方教程](https://aistudio.baidu.com/aistudio/projectdetail/1990920)\n",
    "\n",
    "我们可以参照如图所示的步骤,开启visualdl,然后查看训练过程中的指标变化。\n",
    "\n",
    "<div align=\"center\">\n",
    "  <img src=\"https://ai-studio-static-online.cdn.bcebos.com/284485f03165482493e8399c3277a422ec5520382c564e2b9e1d5c0e113588e1\" width=\"60%\" height=\"60%\" />\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.4 挑选满意的权重上传至Huggingface\n",
    "\n",
    "参数解释:\n",
    "> * **upload_dir**:我们需要上传的文件夹目录。\n",
    "> * **repo_name**:我们需要上传的repo名称,最终我们会上传到 https://huggingface.co/{你的用户名}/{你指定的repo名称}, 例如: https://huggingface.co/peteli/hometown.\n",
    "> * **pretrained_model_name_or_path**:训练该模型所使用的基础模型。\n",
    "> * **prompt**:搭配该权重需要使用的Prompt文本。\n",
    "<div align=\"center\">\n",
    "  <img src=\"https://ai-studio-static-online.cdn.bcebos.com/9036aa64b12d4d1db0b64f685aa98c600aad8f984cbf4ef592bef4c4e6db11e4\" width=\"60%\" height=\"60%\" />\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [],
   "source": [
    "from utils import upload_lora_folder\n",
    "upload_dir                    = \"lora_outputs\"                   # 我们需要上传的文件夹目录\n",
    "repo_name                     = \"hometown\"                  # 我们需要上传的repo名称\n",
    "pretrained_model_name_or_path = \"runwayml/stable-diffusion-v1-5\" # 训练该模型所使用的基础模型\n",
    "prompt                        = \"a sea of lavender and gold flowers in the world of fairy tales is my hometown\" # 搭配该权重需要使用的Prompt文本\n",
    "\n",
    "upload_lora_folder(\n",
    "    upload_dir=upload_dir,\n",
    "    repo_name=repo_name,\n",
    "    pretrained_model_name_or_path=pretrained_model_name_or_path,\n",
    "    prompt=prompt, \n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4.效果展示\n",
    "\n",
    "#### 图1:\n",
    "\n",
    "![](https://ai-studio-static-online.cdn.bcebos.com/b521bc52e4bb4e63b98a2f32a9fd65cbde84088594084e548e25931339a34e0b)\n",
    "\n",
    "#### 图2:\n",
    "\n",
    "![](https://ai-studio-static-online.cdn.bcebos.com/fb2518e3c06b4da5a41973cf6dc81684020e9efd3bfc4b9289163beb774dc530)\n",
    "\n",
    "#### 图3:\n",
    "\n",
    "![](https://ai-studio-static-online.cdn.bcebos.com/b845766ce8b944aead7430146be1ab1fd721456bdce14fe698b7c6978555fa36)\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "py35-paddle1.2.0"
  },
  "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.7.4"
  },
  "toc-autonumbering": false,
  "toc-showcode": false,
  "toc-showtags": false
 },
 "nbformat": 4,
 "nbformat_minor": 4
}