ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Diffusers Textual Inversion 加载指南:TextualInversionLoaderMixin 原理与实战

Diffusers Textual Inversion 加载指南:TextualInversionLoaderMixin 原理与实战 Diffusers Textual Inversion 加载指南TextualInversionLoaderMixin 原理与实战【免费下载链接】diffusers Diffusers: State-of-the-art diffusion models for image, video, and audio generation in PyTorch.项目地址: https://gitcode.com/GitHub_Trending/di/diffusersTextual Inversion文本反演是一种仅凭 35 张示例图片即可个性化扩散模型概念如某个物体、某种画风的训练方法其产物是极小的词嵌入文件仅几 KB可随后加载进文本编码器使用。本文围绕TextualInversionLoaderMixin展开讲解在 Diffusers 中加载 Diffusers 格式与 Automatic1111 格式嵌入的完整流程、底层实现原理并覆盖多向量嵌入、负向嵌入与卸载等进阶用法。什么是 Textual InversionTextual Inversion 通过微调模型的**词嵌入word embeddings**来学习新概念把 35 张示例图片与一个特殊 token如sks绑定训练后该 token 的嵌入向量便记住了概念。由于只更新嵌入向量而不动 UNet/VAE训练产物通常只有几 KB扩散模型本身仍以原始方式使用。正因为权重极小嵌入必须在用DiffusionPipeline.from_pretrained加载完模型之后再加载。Diffusers 通过TextualInversionLoaderMixin提供统一入口既能加载 Diffusers 官方格式的嵌入也能加载 Automatic1111WebUI生态生成的.pt嵌入文件并把对应 token 注册进 tokenizer。加载嵌入的完整流程准备 pipeline先加载基础 pipeline再挂载嵌入import torch from diffusers import AutoPipelineForText2Image pipeline AutoPipelineForText2Image.from_pretrained( stable-diffusion-v1-5/stable-diffusion-v1-5, dtypetorch.float16 ).to(cuda) # 或 mps、xpu、cpu加载 Diffusers 格式嵌入pipeline.load_textual_inversion(sd-concepts-library/gta5-artwork) prompt A cute brown bear eating a slice of pizza, stunning color scheme, masterpiece, illustration, gta5-artwork style pipeline(prompt).images[0]加载后只需在 prompt 中写入嵌入对应的特殊 token如gta5-artwork即可激活该概念。加载 Automatic1111 格式嵌入Automatic1111 格式的嵌入是.pt文件可从 CivitAI 等站点下载加载时通常需要显式指定tokenfrom diffusers import StableDiffusionPipeline import torch model_id stable-diffusion-v1-5/stable-diffusion-v1-5 pipe StableDiffusionPipeline.from_pretrained(model_id, torch_dtypetorch.float16).to(cuda) pipe.load_textual_inversion(./charturnerv2.pt, tokencharturnerv2) prompt charturnerv2, multiple views of the same character in the same outfit, a character turnaround of a woman wearing a black jacket and red shirt, best quality, intricate details. image pipe(prompt, num_inference_steps50).images[0] image.save(character.png)源码通过_retrieve_tokens_and_embeddings自动识别两种格式Diffusers 格式的 state dict 只有单个键token→embeddingA1111 格式则包含string_to_param键与name键见 textual_inversion.py。自定义权重文件名若嵌入文件以自定义名称保存用weight_name指定pipeline.load_textual_inversion( EvilEngine/easynegative, weight_nameeasynegative.safetensors, tokeneasynegative )负向嵌入用 Textual Inversion 提升画质Textual Inversion 也可训练负向嵌入negative embeddings引导模型远离模糊丑陋等不良特征。EasyNegative 是广泛使用的多概念负向嵌入。加载后把对应 token 传给negative_prompt即可生效import torch from diffusers import AutoPipelineForText2Image pipeline AutoPipelineForText2Image.from_pretrained( stable-diffusion-v1-5/stable-diffusion-v1-5, dtypetorch.float16 ).to(cuda) # 或 mps、xpu、cpu pipeline.load_textual_inversion( EvilEngine/easynegative, weight_nameeasynegative.safetensors, tokeneasynegative ) prompt A cute brown bear eating a slice of pizza, stunning color scheme, masterpiece, illustration negative_prompt easynegative pipeline(prompt, negative_prompt).images[0]参数详解load_textual_inversion支持多种输入与选项关键参数如下完整签名见 textual_inversion.py参数类型说明pretrained_model_name_or_pathstr/PathLike/Dict或它们的 listHub 上的模型 ID如sd-concepts-library/low-poly-hd-logos-icons、本地目录./my_text_inversion_directory/、本地文件./my_text_inversions.pt或 torch state dicttokenstr/list[str]可选覆盖嵌入自带的 token当传入 list 时长度须与模型 list 一致tokenizerCLIPTokenizer可选缺省使用self.tokenizertext_encoderCLIPTextModel可选缺省使用self.text_encoderweight_namestr可选自定义权重文件名适用于 Diffusers 格式改名保存或 A1111 格式cache_dirstr/PathLike可选模型下载缓存目录force_downloadbool默认False是否强制重新下载权重proxiesdict[str, str]可选按协议/端点配置代理如{http: foo.bar:3128}local_files_onlybool默认False为True时只加载本地权重不从 Hub 下载hf_tokenstr/bool可选Hub 鉴权 token为True时使用diffusers-cli login生成的 tokenrevisionstr默认main指定模型版本分支名、标签名或 commit idsubfolderstr默认模型仓库内的子目录位置mirrorstr可选国内下载镜像源源码原理加载过程拆解load_textual_inversion的执行可拆解为以下步骤归一化输入将pretrained_model_name_or_path与token包装为 list若未提供 token 则按模型数量复制NoneL379-L387。校验输入_check_text_inv_inputs检查 tokenizer/text_encoder 是否缺失、list 长度是否匹配、token 是否重复L180-L201。加载 state dictload_textual_inversion_state_dicts优先尝试.safetensorslearned_embeds.safetensors失败后回退到 pickle 格式learned_embeds.bin两个常量定义于 textual_inversion.py。解析 token 与嵌入_retrieve_tokens_and_embeddings区分 torch.Tensor、单键 diffusers 格式、含string_to_param的 A1111 格式三种情况若用户传入的 token 与文件内 token 不同会以传入的为准并打印日志L229-L232。处理多向量嵌入_extend_tokens_and_embeddings将形状为(N, dim)的多向量嵌入拆成token, token_1, ..., token_{N-1}多个单向量 tokenL244-L269。维度校验每个嵌入的最后一维必须等于text_encoder.get_input_embeddings().weight.shape[-1]否则报错L412-L417。注入文本编码器先处理 CPU offload hook若之前启用过 model/sequential offload先移除再重挂再调用resize_token_embeddings(len(tokenizer) len(tokens))扩展嵌入矩阵最后tokenizer.add_tokens(token)input_embeddings.data[token_id] embedding写入新向量L420-L465。多向量 token 的 prompt 展开多向量嵌入的 token 在 prompt 中如何生效maybe_convert_promptL123-L178负责把 prompt 里的单一 token 展开为token token_1 token_2 ...序列。这一逻辑被 SD、SDXL、Flux、AnimateDiff 等众多 pipeline 在编码 prompt 前调用例如 pipeline_animatediff.py 与 encoders.py。多嵌入批量加载与显式 tokenizer/text_encoderload_textual_inversion支持一次加载多个嵌入pretrained_model_name_or_path传 list 时token也须等长并可显式指定 tokenizer 与 text_encoder。典型场景是 SDXL它的两个文本编码器需要分别加载嵌入。pipeline AutoPipelineForText2Image.from_pretrained(stabilityai/stable-diffusion-xl-base-1.0) embedding_path hf_hub_download(repo_idlinoyts/web_y2k, filenameweb_y2k_emb.safetensors, repo_typemodel) state_dict load_file(embedding_path) # 加载到 text_encoder 1CLIP ViT-L/14 pipeline.load_textual_inversion( state_dict[clip_l], tokens[s0, s1], text_encoderpipeline.text_encoder, tokenizerpipeline.tokenizer, ) # 加载到 text_encoder 2CLIP ViT-G/14 pipeline.load_textual_inversion( state_dict[clip_g], tokens[s0, s1], text_encoderpipeline.text_encoder_2, tokenizerpipeline.tokenizer_2, )卸载嵌入unload_textual_inversionL467-L605支持移除全部或指定的嵌入from diffusers import AutoPipelineForText2Image pipeline AutoPipelineForText2Image.from_pretrained(stable-diffusion-v1-5/stable-diffusion-v1-5) # 示例 1移除所有 token 嵌入 pipeline.load_textual_inversion(sd-concepts-library/gta5-artwork) pipeline.load_textual_inversion(sd-concepts-library/moeb-style) pipeline.unload_textual_inversion() # 示例 2只移除一个 token pipeline.load_textual_inversion(sd-concepts-library/moeb-style) pipeline.load_textual_inversion(sd-concepts-library/gta5-artwork) pipeline.unload_textual_inversion(moe-bius) # 示例 3SDXL 上按编码器分别卸载 pipeline AutoPipelineForText2Image.from_pretrained(stabilityai/stable-diffusion-xl-base-1.0) # ... 先按上文方式分别加载到两个编码器 ... pipeline.unload_textual_inversion( tokens[s0, s1], text_encoderpipeline.text_encoder, tokenizerpipeline.tokenizer ) pipeline.unload_textual_inversion( tokens[s0, s1], text_encoderpipeline.text_encoder_2, tokenizerpipeline.tokenizer_2 )卸载时只清理非特殊的 added token保留[UNK]、[EOS]等真正的特殊 token并从文本编码器的嵌入矩阵中删除对应行、重建nn.EmbeddingL592-L605。Fast 与 Slow tokenizer 走两条不同的内部清理路径L558-L590。测试验证多格式与 CPU offload 兼容性仓库测试 test_stable_diffusion.py 提供了三个关键用例test_stable_diffusion_textual_inversion同时加载 Hub 上的 Diffusers 格式嵌入low-poly-hd-logos-icons与两个 A1111 格式文件winter_style.pt、winter_style_negative.pt并断言生成结果与基准 numpy 数据的最大差异小于阈值test_stable_diffusion_textual_inversion_with_model_cpu_offload验证启用enable_model_cpu_offload后加载嵌入仍正常——这正是源码中先移除 hook、加载、再恢复 hook逻辑L422-L463的回归保护test_stable_diffusion_textual_inversion_with_sequential_cpu_offload同上覆盖enable_sequential_cpu_offload场景。训练侧补充嵌入从何而来加载是消费端训练是生产端。Diffusers 提供完整的训练脚本 textual_inversion.py核心训练参数包括--pretrained_model_name_or_pathHub 模型名或本地路径--train_data_dir训练图片目录--placeholder_token学习到的嵌入所绑定的特殊词推理时必须写在 prompt 中--initializer_token粗略描述训练对象的初始化词--learnable_propertystyle风格如梵高画风或object物体如你的狗--num_vectors学习嵌入所用的向量数越大效果越好但训练成本越高--checkpointing_steps保存检查点的频率配合--resume_from_checkpoint可断点续训。训练细节可参考 训练指南其中还建议在显存受限时开启gradient_checkpointing与mixed_precision。训练产出的嵌入即可用本文的方法加载使用。总结Textual Inversion 只训练词嵌入产物仅几 KB须在from_pretrained之后通过load_textual_inversion加载同时兼容 Diffuserslearned_embeds.safetensors/.bin与 Automatic1111.pt两种格式A1111 格式通常需显式传token支持多向量嵌入自动展开为token token_1 ...、负向嵌入配合negative_prompt、批量加载与按编码器精确卸载与 model/sequential CPU offload 兼容仓库测试给出了完整的回归验证训练侧脚本与参数可参考 textual_inversion.py 与 训练文档。【免费下载链接】diffusers Diffusers: State-of-the-art diffusion models for image, video, and audio generation in PyTorch.项目地址: https://gitcode.com/GitHub_Trending/di/diffusers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表