news 2026/2/9 6:40:30

第七十篇-V100-32G+命令行代码+运行Flux.1-Schnell+Lora+文生图

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第七十篇-V100-32G+命令行代码+运行Flux.1-Schnell+Lora+文生图

代码

r_test_1.py

importtorchimporttimeimportargparseimportosfromdatetimeimportdatetimefromdiffusersimportFluxPipelinedefsetup_environment():"""设置环境变量优化V100性能"""os.environ["PYTORCH_CUDA_ALLOC_CONF"]="expandable_segments:True,max_split_size_mb:128"os.environ["TOKENIZERS_PARALLELISM"]="false"torch.backends.cudnn.benchmark=Trueiftorch.cuda.is_available():print(f"📊 GPU显存:{torch.cuda.get_device_properties(0).total_memory/1024**3:.2f}GB")print(f"🔧 PyTorch版本:{torch.__version__}")print(f"🔧 CUDA版本:{torch.version.cuda}")defsetup_xformers(pipeline):"""安全启用xformers(带fallback)"""try:# 尝试启用 xformerspipeline.enable_xformers_memory_efficient_attention()print("✅ 启用 xformers 内存高效注意力")except(ImportError,AttributeError)ase:print(f"⚠️ xformers不可用 ({e}), 回退到默认注意力实现")# 可选:启用 attention slicing 作为补充(你已启用)passdefload_flux_model_mini(precision="fp16",device="cuda"):"""超轻量级加载 - V100 OOM专用"""print(f"🚀 正在加载FLUX.1-schnell模型(超轻量模式)...")start_time=time.time()torch_dtype=torch.float16# V100 onlytry:pipeline=FluxPipeline.from_pretrained("/models/flux-schnell",torch_dtype=torch_dtype,use_safetensors=True,# 安全起见:禁用 text encoder offload(FLUX-schnell 无 text encoder))# 关键优化print("✅ 启用顺序CPU卸载...")pipeline.enable_sequential_cpu_offload()print("✅ 启用VAE切片与拼接...")pipeline.vae.enable_slicing()pipeline.vae.enable_tiling()print("✅ 启用Attention Slicing...")pipeline.enable_attention_slicing(slice_size="max")# ✅ 启用 xformers(或 fallback)setup_xformers(pipeline)exceptExceptionase:print(f"❌ 加载失败:{e}")importtraceback traceback.print_exc()raiseload_time=time.time()-start_timeprint(f"✅ 模型加载完成! 耗时:{load_time:.2f}秒")ifdevice=="cuda":print(f"💾 当前VRAM:{torch.cuda.memory_allocated()/1024**3:.2f}GB")print(f"💾 峰值VRAM:{torch.cuda.max_memory_allocated()/1024**3:.2f}GB")returnpipeline,load_timedefload_lora_weights(pipeline,lora_path,lora_weight=1.0):"""加载LoRA权重 - 显存优化版 + 兼容新API"""ifnotlora_path:returnpipeline,0print(f"\n🔌 正在加载LoRA权重:{os.path.basename(lora_path)}")print(f"⚖️ LoRA权重强度:{lora_weight}")start_time=time.time()try:torch.cuda.empty_cache()# 新版 Diffusers 推荐方式(set_adapter 已弃用/更名)pipeline.load_lora_weights(lora_path,adapter_name="default")# ✅ 正确设置 adapter(新版为 set_adapters 或直接 fuse)# 方法1:动态切换(推荐用于多LoRA)pipeline.set_adapters(["default"],adapter_weights=[lora_weight])# 方法2:临时融合(推理更快,但不可逆)→ 注释掉,保持灵活# pipeline.fuse_lora(lora_scale=lora_weight)# pipeline.unfuse_lora() # 需要时再调用load_time=time.time()-start_timeprint(f"✅ LoRA加载完成! 耗时:{load_time:.2f}秒")iftorch.cuda.is_available():print(f"💾 LoRA加载后VRAM:{torch.cuda.memory_allocated()/1024**3:.2f}GB")returnpipeline,load_timeexceptExceptionase:print(f"❌ 加载LoRA失败:{e}")importtraceback traceback.print_exc()returnpipeline,0defgenerate_image_optimized(pipeline,prompt,**kwargs):"""显存优化的生成函数"""torch.cuda.empty_cache()# 移除 FLUX 不支持的参数(避免警告)kwargs.pop("max_sequence_length",None)print(f"\n🎨 开始生成...")print(f"提示词:{prompt[:50]}{'...'iflen(prompt)>50else''}")start_time=time.time()try:result=pipeline(prompt=prompt,**kwargs,)inference_time=time.time()-start_timeprint(f"✅ 生成完成! 耗时:{inference_time:.2f}秒")returnresult.images[0],inference_timeexcepttorch.cuda.OutOfMemoryError:print("❌ 仍然OOM!建议: 1) 降低分辨率 2) 检查LoRA是否兼容FLUX")raisedefmain():setup_environment()parser=argparse.ArgumentParser(description='FLUX.1-schnell推理 + LoRA支持 - V100 OOM优化版')parser.add_argument('--prompt',type=str,required=True,help='生成提示词')parser.add_argument('--negative_prompt',type=str,default="",help='负面提示词')parser.add_argument('--lora_path',type=str,default=None,help='LoRA权重路径 (.safetensors)')parser.add_argument('--lora_weight',type=float,default=1.0,help='LoRA权重强度 (0.0-1.0)')parser.add_argument('--steps',type=int,default=4,help='推理步数 (schnell推荐4)')parser.add_argument('--guidance',type=float,default=0.0,help='引导比例 (schnell必须为0)')parser.add_argument('--height',type=int,default=512,help='图像高度')parser.add_argument('--width',type=int,default=512,help='图像宽度')parser.add_argument('--seed',type=int,default=None,help='随机种子')parser.add_argument('--output_dir',type=str,default='outputs',help='输出目录')args=parser.parse_args()# 验证参数ifargs.guidance!=0.0:print("⚠️ 警告: FLUX.1-schnell要求guidance=0.0,已自动修正")args.guidance=0.0ifargs.height>1024orargs.width>1024:print("⚠️ 警告: 尺寸>1024可能导致OOM,建议减小")print("\n"+"="*60)print("📋 运行配置")print("="*60)print(f"提示词:{args.prompt}")print(f"LoRA:{os.path.basename(args.lora_path)ifargs.lora_pathelse'无'}")print(f"尺寸:{args.width}x{args.height}")print(f"步数:{args.steps}")print(f"种子:{args.seedifargs.seedelse'随机'}")print("="*60)total_start=time.time()# 1. 加载模型pipeline,model_time=load_flux_model_mini("fp16","cuda")# 2. 加载LoRAlora_time=0ifargs.lora_path:pipeline,lora_time=load_lora_weights(pipeline,args.lora_path,args.lora_weight)else:print("\n⏭️ 跳过LoRA加载")# 3. 生成image,gen_time=generate_image_optimized(pipeline,prompt=args.prompt,negative_prompt=args.negative_prompt,height=args.height,width=args.width,num_inference_steps=args.steps,guidance_scale=args.guidance,generator=torch.Generator().manual_seed(args.seed)ifargs.seedelseNone,)# 4. 保存(✅ 文件名缩短)os.makedirs(args.output_dir,exist_ok=True)timestamp_short=datetime.now().strftime("%H%M%S")# 仅时分秒,如 143045lora_tag="lora"ifargs.lora_pathelse"none"output_path=f"{args.output_dir}/flux_{lora_tag}_{timestamp_short}.png"image.save(output_path)print(f"\n💾 图像保存至:{output_path}")# 5. 清理print("\n🧹 清理内存...")delpipeline torch.cuda.empty_cache()# 6. 统计total_time=time.time()-total_startprint("\n"+"="*60)print("📊 最终统计")print("="*60)print(f"模型加载:{model_time:.2f}秒")ifargs.lora_path:print(f"LoRA加载:{lora_time:.2f}秒")print(f"图像生成:{gen_time:.2f}秒")print(f"总耗时:{total_time:.2f}秒")iftorch.cuda.is_available():print(f"剩余显存:{torch.cuda.memory_allocated()/1024**3:.2f}GB")print("="*60)if__name__=="__main__":main()

运行

python r_test_1.py --prompt"a girl, 8k"--lora_path /opt/ai-lora_v1/lora_v1.safetensors --seed42--height512--width512

记录下后面会用到

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/7 12:05:27

lambda的变量捕获机制

https://blog.csdn.net/weixin_69059394/article/details/155944312?spm1001.2014.3001.5502 上述博客的进程中断中提到了lambda的变量捕获机制。 public class demo6 {public static boolean isFinishedfalse;public static void main(String[] args) throws InterruptedExc…

作者头像 李华
网站建设 2026/2/9 6:29:00

掌握核心!如何成为优秀提示工程架构师

从“写提示”到“搭体系”:优秀提示工程架构师的核心能力清单 引言:你离“架构级Prompt设计者”还差一层思维 你有没有过这样的经历? 为了让AI生成符合要求的商品标题,反复调整提示词:“帮我写个吸引人的手机标题”→“…

作者头像 李华
网站建设 2026/2/7 9:51:57

提示工程数据坑:架构师视角下的6个数据质量导致的失败案例

提示工程数据坑:架构师视角下的6个数据质量导致的失败案例 引言:提示工程的“地基”为何比技巧更重要? 2023年,某头部医疗AI公司的辅助诊断系统发生了一起严重事故:一位30岁男性患者因“咳嗽、发热3天”使用该系统,提示工程生成的诊断建议为“肺炎”,但后续CT检查显示…

作者头像 李华
网站建设 2026/2/8 18:00:37

Video标签始终有一层半透明前景怎么办?实战排查(踩坑)记录

Video标签始终有一层半透明前景怎么办?实战排查(踩坑)记录 在今天的开发中,我接手了同事写的一个视频播放页面,测试时发现一个奇怪的问题:video 标签上总是有一层半透明黑色的前景,遮挡了视频显示,简直让人怀疑人生。 我一开始以为是有 遮罩层元素 覆盖在上面,于是:…

作者头像 李华
网站建设 2026/2/6 22:44:30

SamOutVXP-2601: 轻量级高效语言模型

🌟 模型简介 SamOutVXP-2601 相比SamOutVXP之前的架构,使用了卷积新的架构,从而实现了推理速度的提升,训练速度的提升。 📦 模型结构参数数值参数量46M 🎯层数8 🧱隐藏维度512 📐上下…

作者头像 李华
网站建设 2026/2/8 14:47:40

Springboot如何解决跨域问题?

Springboot如何解决跨域问题?Springboot如何解决跨域问题?一、先搞懂:为什么会有跨域?1.1 同源的定义1.2 跨域的表现二、方案1:JSONP(基本不用)2.1 原理2.2 实战代码后端接口前端测试2.3 适用场…

作者头像 李华