前言
接触 AI 绘画后,想自己训练一个 LoRA 模型来实现自己想要的效果,但自己的显卡训练模型非常慢,或者显存太小无法训练,此时就可以通过云端进行模型训练。
使用工具
这里我使用 SD-Trainer 提供的打标器对图片进行打标,使用 SD-Trainer Installer 进行安装。
云端训练使用的是 Kaggle 平台,使用邮箱注册并且绑定手机号。
云端训练脚本使用的是 SD Scripts Kaggle Jupyter NoteBook,该脚本将会部署 sd-scripts 进行 Stable Diffusion 模型训练。
为了方便存储模型和训练集,使用 HuggingFace 和 ModelScope 平台,这 2 个平台的使用教程可以阅读《使用 HuggingFace / ModelScope 保存和下载文件》这篇文章。
准备训练集
一般想训练出比较好效果的 LoRA,训练集最好准备 50 张以上的图片,为了方便演示,所以只准备了 3 张图片,下面是训练集的结构。
![](/../img/use_kaggle_to_training_sd_model/dataset_structure.png)
character_aaaki 为训练集的名称,填写训练集路径时,只能填到 character_aaaki 这一层路径,不能继续将路径深入。
在 character_aaaki 这个文件夹下是不同子文件夹,并且按照{重复次数}_{子训练集名称}
这个格式进行命名,则 1_aaaki 这个子训练集在每轮训练时,里面的图片只会被训练 1 次,而 2_aaaki 这个子训练集中的图片会被训练 2 次。
子训练集的数量和子训练集设置的重复次数根据自己的训练素材来设置。
在子训练集中存放的则是图片,模型在训练时将会学习图片中的特征,但这些图片缺少标注,所以使用打标器对图片进行内容标注。
图片标注
这里需要对 1_aaaki 和 2_aaaki 这 2 个子训练集进行打标,使用 SD-Trainer 中的打标工具。
打开 SD-Trainer 后,进入 WD 标签器,在图片文件夹路径
填写子训练集的路径,Tagger 模型
选择 wd-eva02-large-tagger-v3(这个打标模型的标注比较详细,不过选择其他 Tagger 模型也可以)。
因为我训练的是人物 LoRA,需要为人物 LoRA 设置触发词,所以在附加提示词 (逗号分隔)
中填写了触发词,如果训练的是画风 LoRA,则一般不需要设置触发词。
这里将将结果中的括号进行转义处理
取消勾选,因为训练脚本所使用的 sd-scripts 不需要对标注文本中的括号进行转义处理。
![](/../img/use_kaggle_to_training_sd_model/use_sd_trainer_tagger_tool.png)
配置完成后点击右边的启动
按钮对子训练集中的图片进行标注,将子训练集分别进行打标处理后,训练集结构如下。
![](/../img/use_kaggle_to_training_sd_model/dataset_structure_with_tag_file.png)
配置 Kaggle 训练脚本
处理完训练集后,现在对云端的训练脚本进行配置,进入 sd-webui-all-in-one 项目地址,找到 SD Scripts Kaggle Jupyter NoteBook 后,点击 sd_scripts_kaggle.ipynb 下载该训练脚本。
进入 Kaggle 官网,点击左侧的 Code(代码),在 Code(代码)界面点击 Your Work(个人工作),在该界面可以看到自己创建的 Notebooks(基于 Jupyter 的笔记本)。点击上方的 Create(创建)-> New Notebook(新建笔记本),此时将新建一个新的笔记本并打开编辑界面。
在编辑界面的顶部点击 File(文件)-> Import Notebook(导入笔记本),在右侧的导入界面选择刚刚下载下来的 sd_scripts_kaggle.ipynb,再点击下方的 Import(导入)将训练脚本导入 Kaggle。
![](/../img/use_kaggle_to_training_sd_model/import_notebook_to_kaggle.png)
将 sd_scripts_kaggle.ipynb 导入后,如果右侧没有看到 Kaggle Notebook 的配置界面,可以点击右下角的小三角箭头打开,然后在右侧 Notebook(笔记本)-> Session options(会话选项)-> ACCELERATOR(加速器)选项选择 GPU T4 x 2,此时训练脚本基本配置完成。
配置训练脚本参数
该训练脚本主要分为 6 大部分,第 1 部分是训练脚本的简单说明,第 2 部分则是该训练脚本的功能初始化单元,该部分包含大量处理训练环境的函数,如果对训练脚本功能的具体代码实现感兴趣,可以阅读该部分的代码,否则直接忽略该部分。
在每个大标题的下方包含下一个单元
和上一个单元
按钮,点击按钮可以快速跳转笔记本不同的单元。
下一个单元是参数配置
单元,这里设置了在 Kaggle 部署训练环境的不同参数。
![](/../img/use_kaggle_to_training_sd_model/configure_unit.png)
环境设置
中的内容通常不需要修改,保持默认即可。
sd-scripts 版本设置
设置了使用 sd-scripts 的分支和版本,这里可以看 sd-scripts 在 Github 的项目。
![](/../img/use_kaggle_to_training_sd_model/sd_scripts_github_repo.png)
在该项目的左上角为项目的分支,不同的分支功能会有些差异,稳定性不同,通常使用 dev 分支即可,右上角为 Commits(提交记录),该项目没更新一次时将生成一个新的 Commit(提交记录)对应的哈希值,可以通过该哈希值切换版本。
sd-scripts 版本设置
通常不需要修改。
模型上传设置
设置训练结束后将模型上传到 HuggingFace / ModelScope。如果没有设置该选项,在训练结束后,只能从 Kaggle Output 中下载训练好的模型。这里推荐启用该选项,则将USE_HF_TO_SAVE_MODEL
和USE_MS_TO_SAVE_MODEL
的值从False
设置为True
。
设置后,需要分别获取 HuggingFace Token 和 ModelScope Token。
进入 HuggingFace 官网后,点击右上角头像打开菜单,选择 Access Tokens -> Create new token,在 Token name(密钥名字)随便填写一个名字,然后在 Repositories(仓库)选项将下方的 3 个选项勾选,再点击下方的 Create token(创建密钥),此时将获得 HuggingFace Token,复制下来并保管好,比如获取到的 HuggingFace Token 为hf_abcdef
。
进入 ModelScope 官网后,点击首页 -> 访问令牌 -> SDK 令牌 -> 新建 SDK 令牌
,输入名称后点击新建令牌
,再将 SDK 令牌复制下来并保管好,比如刚刚获取到的 ModelScope SDK 令牌(ModelScope Token)为ms_fedcba
。
获取到 HuggingFace Token 和 ModelScope SDK 令牌后,将训练脚本的HF_TOKEN
值修改为hf_abcdef
,即HF_TOKEN = "hf_abcdef"
。将MS_TOKEN
的值修改为ms_fedcba
,即MS_TOKEN = "ms_fedcba"
。
接下来在 HuggingFace 和 ModelScope 分别创建一个模型仓库。
![](/../img/use_kaggle_to_training_sd_model/create_huggingface_model_repo.png)
![](/../img/use_kaggle_to_training_sd_model/create_modelscope_model_repo.png)
此时在 HuggingFace 上创建的模型仓库 ID 为licyk/sd_training_model
,在 ModelScope 上创建的模型仓库 ID 为licyks/sd_training_model
。
得到 HuggingFace 仓库 ID 后,将HF_REPO_ID
的值设置为 HuggingFace 上创建的模型仓库 ID,即licyk/sd_training_model
,将HF_REPO_TYPE
的值修改为model
。
得到 ModelScope 仓库 ID 后,将MS_REPO_ID
的值设置为 ModelScope 上创建的模型仓库 ID,即licyks/sd_training_model
,将MS_REPO_TYPE
的值修改为model
。
因为使用 ModelScope 上传模型的功能基于 Git,所以需要配置 Git 的个人信息,但通常使用默认值即可。
![](/../img/use_kaggle_to_training_sd_model/model_upload_setting.png)
路径设置
配置了一些预设路径,通常不需要修改。
训练模型设置
提供了一部分常用的大模型和 VAE 模型,可以根据自己训练的要求进行选择。
在模型列表中,前面部分的为模型下载链接,后面为数字,当数字设置为 1 时,模型将会被下载。设置为其他数字时,模型将不会被下载。
例如["https://huggingface.co/licyk/sd-model/resolve/main/sd_1.5/v1-5-pruned-emaonly.safetensors", 0],
和["https://huggingface.co/licyk/sd-model/resolve/main/sd_1.5/animefull-final-pruned.safetensors", 1],
,当在进行环境安装时,前面的模型不会被下载,后面的模型将被下载,并且模型的名称为animefull-final-pruned.safetensors
。
模型将会下载到{SD_MODEL_PATH}
,即/kaggle/sd-models
。
下面是配置好的训练脚本参数。
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
| WORKSPACE = "/kaggle" WORKFOLDER = "sd-scripts" SD_SCRIPTS_PATH = "/kaggle/sd-scripts" TORCH_VER = "torch==2.5.0+cu121 torchvision==0.20.0+cu121 torchaudio==2.5.0+cu121" XFORMERS_VER = "xformers==0.0.28.post2" USE_UV = True
SD_SCRIPTS_BRANCH = "dev" SD_SCRIPTS_COMMIT = ""
USE_HF_TO_SAVE_MODEL = True USE_MS_TO_SAVE_MODEL = True
USE_NEW_MS_UPLOADER = False
HF_TOKEN = "hf_abcdef"
MS_TOKEN = "ms_fedcba"
HF_REPO_ID = "licyk/sd_training_model" HF_REPO_TYPE = "model"
MS_REPO_ID = "licyks/sd_training_model" MS_REPO_TYPE = "model"
HF_REPO_VISIBILITY = False MS_REPO_VISIBILITY = False
GIT_USER_EMAIL = "username@example.com" GIT_USER_NAME = "username"
LOG_MODULE = "tensorboard"
WANDB_TOKEN = ""
INPUT_DATASET_PATH = "/kaggle/dataset" OUTPUT_PATH = "/kaggle/working/model" SD_MODEL_PATH = "/kaggle/sd-models" KAGGLE_INPUT_PATH = "/kaggle/input"
SD_MODEL = [ ["https://huggingface.co/licyk/sd-model/resolve/main/sd_1.5/v1-5-pruned-emaonly.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sd_1.5/animefull-final-pruned.safetensors", 1], ["https://huggingface.co/licyk/sd-model/resolve/main/sd_1.5/Counterfeit-V3.0_fp16.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sd_1.5/cetusMix_Whalefall2.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sd_1.5/cuteyukimixAdorable_neochapter3.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sd_1.5/ekmix-pastel-fp16-no-ema.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sd_1.5/ex2K_sse2.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sd_1.5/kohakuV5_rev2.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sd_1.5/meinamix_meinaV11.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sd_1.5/oukaStar_10.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sd_1.5/pastelMixStylizedAnime_pastelMixPrunedFP16.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sd_1.5/rabbit_v6.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sd_1.5/sweetSugarSyndrome_rev15.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sd_1.5/AnythingV5Ink_ink.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sd_1.5/bartstyledbBlueArchiveArtStyleFineTunedModel_v10.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sd_1.5/meinapastel_v6Pastel.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sd_1.5/qteamixQ_omegaFp16.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sd_1.5/tmndMix_tmndMixSPRAINBOW.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sdxl_1.0/sd_xl_base_1.0_0.9vae.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sdxl_1.0/animagine-xl-3.0.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sdxl_1.0/AnythingXL_xl.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sdxl_1.0/abyssorangeXLElse_v10.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sdxl_1.0/animaPencilXL_v200.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sdxl_1.0/animagine-xl-3.1.safetensors", 1], ["https://huggingface.co/licyk/sd-model/resolve/main/sdxl_1.0/heartOfAppleXL_v20.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sdxl_1.0/baxlBartstylexlBlueArchiveFlatCelluloid_xlv1.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sdxl_1.0/kohaku-xl-delta-rev1.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sdxl_1.0/kohakuXLEpsilon_rev1.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sdxl_1.0/kohaku-xl-epsilon-rev3.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sdxl_1.0/kohaku-xl-zeta.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sdxl_1.0/nekorayxl_v06W3.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sdxl_1.0/CounterfeitXL-V1.0.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sdxl_1.0/ponyDiffusionV6XL_v6StartWithThisOne.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sdxl_1.0/Illustrious-XL-v0.1.safetensors", 1], ["https://huggingface.co/licyk/sd-model/resolve/main/sdxl_1.0/noobaiXLNAIXL_earlyAccessVersion.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sdxl_1.0/noobaiXLNAIXL_epsilonPred05Version.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sdxl_1.0/noobaiXLNAIXL_epsilonPred075.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sdxl_1.0/noobaiXLNAIXL_epsilonPred077.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sdxl_1.0/noobaiXLNAIXL_epsilonPred10Version.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sdxl_1.0/noobaiXLNAIXL_epsilonPred11Version.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sdxl_1.0/noobaiXLNAIXL_vPredTestVersion.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sdxl_1.0/noobaiXLNAIXL_vPred05Version.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sdxl_1.0/noobaiXLNAIXL_vPred06Version.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sdxl_1.0/noobaiXLNAIXL_vPred065SVersion.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sdxl_1.0/noobaiXLNAIXL_vPred075SVersion.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sdxl_1.0/noobaiXLNAIXL_vPred09RVersion.safetensors", 0], ["https://huggingface.co/licyk/sd-model/resolve/main/sdxl_1.0/noobaiXLNAIXL_vPred10Version.safetensors", 0],
["https://huggingface.co/licyk/sd-vae/resolve/main/sd_1.5/vae-ft-ema-560000-ema-pruned.safetensors", 0], ["https://huggingface.co/licyk/sd-vae/resolve/main/sd_1.5/vae-ft-mse-840000-ema-pruned.safetensors", 1], ["https://huggingface.co/licyk/sd-vae/resolve/main/sdxl_1.0/sdxl_fp16_fix_vae.safetensors", 1], ]
echo("参数设置完成")
|
自定义模型上传
训练脚本提供的模型可能不适合自己的训练要求,此时可以上传自己所需的模型。比如我需要上传ill-xl.safetensors
这个模型,下面提供了 3 种方式进行模型上传。
在右侧的 Kaggle Input(Kaggle 导入工具)支持上传自己的模型到 Kaggle 中,在 Notebook(笔记本)-> Input(导入)-> Upload(上传)-> New Model(新建模型),在模型上传界面选择要上传的模型,此时将弹出模型信息设置界面。MODEL NAME(模型名称)填写模型的名称,这将决定模型所在的文件夹名称,这里我设置成ill-xl-01
,FRAMEWORK(框架)选择 Other,LICENSE(许可证)选择 Unknown,如果还有其他需要上传的模型,可以在下方继续选择模型,配置完成后点击 Create(创建)上传模型。
![](/../img/use_kaggle_to_training_sd_model/use_kaggle_input_to_upload_model.png)
根据刚刚设置的 MODEL NAME(模型名称),上传的ill-xl.safetensors
模型将会在{INPUT_DATASET_PATH}/ill-xl-01/ill-xl.safetensors
,即/kaggle/dataset/ill-xl-01/ill-xl.safetensors
。
2. 使用模型下载链接上传模型
除了可以使用 Kaggle Input(Kaggle 导入工具)上传模型,还可以将模型上传到模型托管平台,获取模型下载链接后使用下载链接将模型下载到 Kaggle 中。
刚刚在 ModelScope 上创建了一个模型仓库,并将ill-xl.safetensors
上传到该仓库中。
![](/../img/use_kaggle_to_training_sd_model/upload_model_to_modelscope.png)
右键下载按钮后获取到下载链接,比如https://modelscope.cn/models/licyks/sd_training_model/resolve/master/ill-xl.safetensors
。
得到模型下载链接后,可以通过sd_scripts.get_model()
函数将模型下载到 Kaggle 中。在安装单元中有注释说明了该函数的用法,根据注释的说明进行修改。
1 2 3 4 5
| sd_scripts.get_model( url="https://modelscope.cn/models/licyks/sd_training_model/resolve/master/ill-xl.safetensors", path=SD_MODEL_PATH, filename="ill-xl.safetensors" )
|
![](/../img/use_kaggle_to_training_sd_model/use_model_download_link_to_input_model.png)
该模型下载到{SD_MODEL_PATH}/ill-xl.safetensors
,即/kaggle/sd-models/ill-xl.safetensors
。
3. 使用 HuggingFace 上传模型
如果将文件保存到 HuggingFace,比如将ill-xl.safetensors
上传到刚刚在 HuggingFace 上创建的模型仓库。
![](/../img/use_kaggle_to_training_sd_model/upload_model_to_huggingface.png)
在 HuggingFace 上可以获取文件的下载链接,使用上面的方法将模型下载到 Kaggle 中,也可以使用sd_scripts.dataset.get_single_file_from_hf()
函数下载到 kaggle 中。在安装单元中有注释说明了该函数的用法,根据注释的说明进行修改。
1 2 3 4 5 6
| sd_scripts.dataset.get_single_file_from_hf( repo_id="licyk/sd_training_model", repo_type="model", filename="ill-xl.safetensors", local_dir=SD_MODEL_PATH, )
|
![](/../img/use_kaggle_to_training_sd_model/use_hf_api_to_input_model.png)
如果刚刚的模型仓库为私有仓库,则需要 HuggingFace Token 进行访问,此时需要添加token
参数传入 HuggingFace Token。
1 2 3 4 5 6 7
| sd_scripts.dataset.get_single_file_from_hf( repo_id="licyk/sd_training_model", repo_type="model", filename="ill-xl.safetensors", local_dir=SD_MODEL_PATH, token=HF_TOKEN, )
|
![](/../img/use_kaggle_to_training_sd_model/use_hf_api_with_token_to_input_model.png)
模型将会下载到{SD_MODEL_PATH}/ill-xl.safetensors
,即/kaggle/sd-models/ill-xl.safetensors
。
4. 使用 ModelScope 上传模型
如果将文件保存到 ModelScope,比如将ill-xl.safetensors
上传到刚刚在 ModelScope 上创建的模型仓库,可以使用sd_scripts.dataset.get_single_file_from_ms()
函数进行下载。
1 2 3 4 5 6 7
| sd_scripts.dataset.get_single_file_from_ms( repo_id="licyk/sd_training_model", repo_type="model", filename="ill-xl.safetensors", local_dir=SD_MODEL_PATH, token=MS_TOKEN, )
|
sd_scripts.dataset.get_single_file_from_ms()
函数的使用方法和sd_scripts.dataset.get_single_file_from_hf()
函数基本一致,可参考使用 HuggingFace 上传模型
中的说明进行使用。
训练集上传
有了训练所需的模型之后,还需要上传训练集作为训练素材,下面提供 3 种方式上传训练集。
在右侧的 Kaggle Input(Kaggle 导入工具)支持上传自己的训练集到 Kaggle 中,在 Notebook(笔记本)-> Input(导入)-> Upload(上传)-> New Dataset(新建数据集),在训练集上传界面选择自己的训练集文件夹,比如前面创建的character_aaaki
文件夹,在 DATASET TITLE(数据集名称)填写训练集的名字,这里我填的是ch-aaaki
,再点击 Create(创建)上传训练集。
![](/../img/use_kaggle_to_training_sd_model/upload_dataset_folder_to_kaggle.png)
如果为了加快上传速度,可以将训练集文件夹压缩成 ZIP 文件再上传。
![](/../img/use_kaggle_to_training_sd_model/compress_folder_to_zip_file.png)
![](/../img/use_kaggle_to_training_sd_model/upload_dataset_zip_file_to_kaggle.png)
根据刚刚设置的 DATASET TITLE(数据集名称),训练集将上传到{INPUT_DATASET_PATH}/ch-aaaki/character_aaaki
,即/kaggle/dataset/ch-aaaki/character_aaaki
。
2. 使用训练集下载链接上传训练集
除了可以使用 Kaggle Input(Kaggle 导入工具)上传训练集,还可以将训练集进行压缩,上传训练集压缩包到模型托管平台,获取训练集下载链接后使用下载链接将训练集下载到 Kaggle 中。
将训练集使用 ZIP / 7Z / TAR 格式进行压缩后,利用之前在 ModelScope 上创建的仓库上传训练集压缩包。
![](/../img/use_kaggle_to_training_sd_model/upload_dataset_zip_file_to_modelscope.png)
右键下载按钮后获取到下载链接,比如https://modelscope.cn/models/licyks/sd_training_model/resolve/master/character_aaaki.zip
。
得到模型下载链接后,可以通过sd_scripts.dataset.get_dataset()
函数将模型下载到 Kaggle 中。在安装单元中有注释说明了该函数的用法,根据注释的说明进行修改。
1 2 3 4 5
| sd_scripts.dataset.get_dataset( dataset_path=INPUT_DATASET_PATH, url="https://modelscope.cn/models/licyks/sd_training_model/resolve/master/character_aaaki.zip", name="character_aaaki.zip", )
|
![](/../img/use_kaggle_to_training_sd_model/use_dataset_download_link_to_input_dataset.png)
该训练集将会下载并解压到{INPUT_DATASET_PATH}
中,即/kaggle/dataset
,解压出来的文件夹名称为character_aaaki
(和压缩character_aaaki
这个文件夹时处理方式有关),则该训练集的完整路径为/kaggle/dataset/character_aaaki
。
3. 使用 HuggingFace 上传训练集
如果将训练集保存到 HuggingFace,比如在 HuggingFace 上创建一个训练集仓库,将character_aaaki
这个文件夹上传到刚创建的训练集仓库。
![](/../img/use_kaggle_to_training_sd_model/upload_dataset_to_huggingface.png)
再使用sd_scripts.dataset.get_dataset_from_hf()
函数将训练集下载到 Kaggle 中。在安装单元中有注释说明了该函数的用法,根据注释的说明进行修改。
1 2 3 4 5 6
| sd_scripts.dataset.get_dataset_from_hf( local_path=INPUT_DATASET_PATH, repo_id="licyk/sd_training_dataset", repo_type="dataset", folder="character_aaaki", )
|
![](/../img/use_kaggle_to_training_sd_model/use_hf_api_to_input_dataset.png)
如果刚刚的训练集仓库为私有仓库,则需要 HuggingFace Token 进行访问,此时需要添加hf_token
参数传入 HuggingFace Token。
1 2 3 4 5 6 7
| sd_scripts.dataset.get_dataset_from_hf( local_path=INPUT_DATASET_PATH, repo_id="licyk/sd_training_dataset", repo_type="dataset", folder="character_aaaki", hf_token=HF_TOKEN, )
|
![](/../img/use_kaggle_to_training_sd_model/use_hf_api_with_token_to_input_dataset.png)
训练集将会下载并解压到{INPUT_DATASET_PATH}
中,即/kaggle/dataset
,文件夹名称为character_aaaki
(下载训练集的时候会保持和在 HuggingFace 中一样的目录结构),则该训练集的完整路径为/kaggle/dataset/character_aaaki
。
小技巧
前面的 character_aaaki 训练集上传到 HuggingFace 上时结构如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| HuggingFace_Repo (licyk/sd_training_dataset) ├── character_aaaki │ ├── 1_aaaki │ │ ├── 1.png │ │ ├── 1.txt │ │ ├── 3.png │ │ └── 3.txt │ └── 2_aaaki │ ├── 4.png │ └── 4.txt ├── character_robin │ └── 1_xxx │ ├── 11.png │ └── 11.txt └── style_pvc └── 5_aaa ├── test.png └── test.txt
|
可能有时候不想为训练集中每个子训练集设置不同的重复次数,又不想上传的时候再多套一层文件夹,就把训练集结构调整成了下面的(我自己经常这样做):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| HuggingFace_Repo (licyk/sd_training_dataset) ├── character_aaaki │ ├── 1.png │ ├── 1.txt │ ├── 3.png │ ├── 3.txt │ ├── 4.png │ └── 4.txt ├── character_robin │ └── 1_xxx │ ├── 11.png │ └── 11.txt └── style_pvc └── 5_aaa ├── test.png └── test.txt
|
此时这个状态的训练集是缺少子训练集和重复次数的,如果直接使用sd_scripts.dataset.get_dataset_from_hf()
去下载训练集并用于训练将会导致报错。不过没关系,可以自己再编写一个函数对sd_scripts.dataset.get_dataset_from_hf()
函数再次封装,自动加上子训练集并设置重复次数。
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
| def make_dataset( local_path: Union[str, Path], repo_id: str, repo_type: str, repeat: int, folder: str, hf_token: Optional[str] = None ) -> None: import os import shutil
origin_dataset_path = os.path.join(local_path, folder) tmp_dataset_path = os.path.join(local_path, f"{repeat}_{folder}") new_dataset_path = os.path.join(origin_dataset_path, f"{repeat}_{folder}") sd_scripts.dataset.get_dataset_from_hf( local_path=local_path, repo_id=repo_id, repo_type=repo_type, folder=folder, hf_token=hf_token ) if os.path.exists(origin_dataset_path): echo(f"设置 {folder} 训练集的重复次数为 {repeat}") shutil.move(origin_dataset_path, tmp_dataset_path) shutil.move(tmp_dataset_path, new_dataset_path) else: echo(f"从 {repo_id} 下载 {folder} 失败")
|
编写好后,可以去调用这个函数了。
1 2 3 4 5 6 7 8
| make_dataset( local_path=INPUT_DATASET_PATH, repo_id="licyk/sd_training_dataset", repo_type="dataset", repeat=3, folder="character_aaaki", hf_token=HF_TOKEN, )
|
该函数将会把character_aaaki
训练集下载到{INPUT_DATASET_PATH}
中,即/kaggle/dataset
,文件夹名称为character_aaaki
,并且character_aaaki
文件夹内继续创建了一个子文件夹作为子训练集,根据repeat=3
将子训练集的重复次数设置为 3。
4. 使用 ModelScope 上传训练集
如果将训练集保存到 HuggingFace,比如在 HuggingFace 上创建一个训练集仓库,将character_aaaki
这个文件夹上传到刚创建的训练集仓库。
再使用sd_scripts.dataset.get_dataset_from_ms()
函数将训练集下载到 Kaggle 中。在安装单元中有注释说明了该函数的用法,根据注释的说明进行修改。
1 2 3 4 5 6 7
| sd_scripts.dataset.get_dataset_from_ms( local_path=INPUT_DATASET_PATH, repo_id="licyk/sd_training_dataset", repo_type="dataset", folder="character_aaaki", ms_token=MS_TOKEN, )
|
sd_scripts.dataset.get_dataset_from_ms()
函数的用法和sd_scripts.dataset.get_dataset_from_hf()
函数基本一致,可参考使用 HuggingFace 上传训练集
中的说明进行使用。
编写训练参数
有了模型和训练集,此时就可以编写模型训练参数进行模型训练了,在模型训练单元中编写训练训练命令。
因为篇幅问题,这里就不涉及大量的训练参数说明,直接使用已有训练参数模板,在已有的训练参数上进行修改。
下面是我比较常用的训练参数,可以自行在这些模板中寻找。
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
|
|
![](/../img/use_kaggle_to_training_sd_model/training_configure_template.png)
在该训练命令中,前面使用了#
进行注释,此时需要将这些注释取消掉使其能够被执行,使用鼠标选中这些命令。
![](/../img/use_kaggle_to_training_sd_model/select_training_cmd.png)
选择后按下Ctrl + /
快捷键取消注释,此时训练命令前面的#
被清除掉,如果将训练代码加上注释,选择代码后再按下Ctrl + /
快捷键即可。
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
|
!python -m accelerate.commands.launch \ --num_cpu_threads_per_process=1 \ --multi_gpu \ --num_processes=2 \ "{SD_SCRIPTS_PATH}/sdxl_train_network.py" \ --pretrained_model_name_or_path="{SD_MODEL_PATH}/Illustrious-XL-v0.1.safetensors" \ --vae="{SD_MODEL_PATH}/sdxl_fp16_fix_vae.safetensors" \ --train_data_dir="{INPUT_DATASET_PATH}/Nachoneko" \ --output_name="Nachoneko_2" \ --output_dir="{OUTPUT_PATH}/Nachoneko" \ --log_tracker_name="lora-Nachoneko" \ --prior_loss_weight=1 \ --resolution="1024,1024" \ --enable_bucket \ --min_bucket_reso=256 \ --max_bucket_reso=4096 \ --bucket_reso_steps=64 \ --save_model_as="safetensors" \ --save_precision="fp16" \ --save_every_n_epochs=2 \ --max_train_epochs=40 \ --train_batch_size=6 \ --gradient_checkpointing \ --network_train_unet_only \ --learning_rate=0.0001 \ --unet_lr=0.0001 \ --text_encoder_lr=0.00001 \ --lr_scheduler="constant_with_warmup" \ --lr_warmup_steps=100 \ --optimizer_type="Lion8bit" \ --network_module="lycoris.kohya" \ --network_dim=100000 \ --network_alpha=100000 \ --network_args \ conv_dim=100000 \ conv_alpha=100000 \ algo=lokr \ dropout=0 \ factor=8 \ train_norm=True \ preset="full" \ --optimizer_args \ weight_decay=0.05 \ betas="0.9,0.95" \ --log_with="{LOG_MODULE}" \ --logging_dir="{OUTPUT_PATH}/logs" \ --caption_extension=".txt" \ --shuffle_caption \ --keep_tokens=0 \ --max_token_length=225 \ --seed=1337 \ --mixed_precision="fp16" \ --xformers \ --cache_latents \ --cache_latents_to_disk \ --persistent_data_loader_workers \ --debiased_estimation_loss \ --full_fp16
|
现在修改一下大模型路径和训练集路径,即--pretrained_model_name_or_path
和--train_data_dir
的值,路径根据前面选择的方法得到的路径来选择。比如大模型路径为SD_MODEL_PATH/ill-xl.safetensors
,训练集路径为{INPUT_DATASET_PATH}/character_aaaki
,则修改后对应的参数为--pretrained_model_name_or_path="{SD_MODEL_PATH}/ill-xl.safetensors"
和--train_data_dir="{INPUT_DATASET_PATH}/character_aaaki"
。注意这里的{SD_MODEL_PATH}
和{INPUT_DATASET_PATH}
为变量,在 Jupyter Notebook 的 Shell 调用方法中需要加上{}
符号将变量中的值解析为对应的内容。
这里再修改一下模型保存路径和模型的保存的名称,需要修改--output_dir
和--output_name
的值。比如我想让训练出来的模型保存在lora-character-aaaki
文件夹,模型保存的名称为ill-xl-character-aaaki
,则修改后对应的参数为--output_dir="{OUTPUT_PATH}/lora-character-aaaki"
和--output_name="ill-xl-character-aaaki"
。
其他参数保持默认即可,如果了解这些训练参数中的作用,也可以自行修改。修改后的训练命令如下。
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
|
!python -m accelerate.commands.launch \ --num_cpu_threads_per_process=1 \ --multi_gpu \ --num_processes=2 \ "{SD_SCRIPTS_PATH}/sdxl_train_network.py" \ --pretrained_model_name_or_path="{SD_MODEL_PATH}/ill-xl.safetensors" \ --vae="{SD_MODEL_PATH}/sdxl_fp16_fix_vae.safetensors" \ --train_data_dir="{INPUT_DATASET_PATH}/character_aaaki" \ --output_name="ill-xl-character-aaaki" \ --output_dir="{OUTPUT_PATH}/lora-character-aaaki" \ --log_tracker_name="ill-xl-character-aaaki" \ --prior_loss_weight=1 \ --resolution="1024,1024" \ --enable_bucket \ --min_bucket_reso=256 \ --max_bucket_reso=4096 \ --bucket_reso_steps=64 \ --save_model_as="safetensors" \ --save_precision="fp16" \ --save_every_n_epochs=2 \ --max_train_epochs=40 \ --train_batch_size=6 \ --gradient_checkpointing \ --network_train_unet_only \ --learning_rate=0.0001 \ --unet_lr=0.0001 \ --text_encoder_lr=0.00001 \ --lr_scheduler="constant_with_warmup" \ --lr_warmup_steps=100 \ --optimizer_type="Lion8bit" \ --network_module="lycoris.kohya" \ --network_dim=100000 \ --network_alpha=100000 \ --network_args \ conv_dim=100000 \ conv_alpha=100000 \ algo=lokr \ dropout=0 \ factor=8 \ train_norm=True \ preset="full" \ --optimizer_args \ weight_decay=0.05 \ betas="0.9,0.95" \ --log_with="{LOG_MODULE}" \ --logging_dir="{OUTPUT_PATH}/logs" \ --caption_extension=".txt" \ --shuffle_caption \ --keep_tokens=0 \ --max_token_length=225 \ --seed=1337 \ --mixed_precision="fp16" \ --xformers \ --cache_latents \ --cache_latents_to_disk \ --persistent_data_loader_workers \ --debiased_estimation_loss \ --full_fp16
|
![](/../img/use_kaggle_to_training_sd_model/configure_training_cmd.png)
现在模型的训练参数就配置完成了。
启动训练脚本
点击 Kaggle 右上角的 Save Version(保存版本),在 VERSION TYPE(版本种类)选项中选择Save & Run All (Commit)
(保存并运行所有单元 (提交记录)),再点击右下角的 Save(保存),此时将依次运行训练脚本中的单元。
![](/../img/use_kaggle_to_training_sd_model/run_notebook.png)
运行后点击 Kaggle 左下角的按钮可以打开 Active Event(运行中的实例),可以看到刚刚启动的训练脚本。
![](/../img/use_kaggle_to_training_sd_model/kaggle_active_event.png)
点击后可以在 Logs(日志)查看实时的训练日志。
![](/../img/use_kaggle_to_training_sd_model/training_logs.png)
下载训练好的模型
如果训练成功后,可以在 Kaggle Output(Kaggle 输出)中查看训练好的模型,选择其中一个模型后可以下载该模型。
![](/../img/use_kaggle_to_training_sd_model/download_training_model_from_kaggle.png)
如果在模型上传设置
启用了 HuggingFace 和 ModelScope,在 HuggingFace 和 ModelScope 上的仓库中也可以下载模型。
![](/../img/use_kaggle_to_training_sd_model/download_training_model_from_huggingface.png)
![](/../img/use_kaggle_to_training_sd_model/download_training_model_from_modelscope.png)
将下载下来的模型导入 Stable Diffusion WebUI,ComfyUI 等软件中即可使用。