当前位置:   article > 正文

《满怀美梦的小崽子是pycharm主义者》之服务器部署stable diffusion /diffusers教程_用vscode使用 diffusers

用vscode使用 diffusers

距离上一次教大家在本地部署sd已经过去了........俺也不知道多久了,相信大家现在应该都已经很熟悉了吧,估计大家也发现了一个问题,就是本地的配置跑sd,一个是对配置要求太高了,现在的模型都特别大,没有一张3090根本玩不了,一个是内存啥的根本不够用模型加上各种插件,生成图啥的,分分钟100g上下,普通玩家属实顶不住,别急,今天就教给大家, 如何在服务器上部署一台自己的sd,让大家体验一下小学偷摸上网吧的快感。

vscode与pycharm的安装

虽然如果是用服务器的话,用vscode会比较好,但是,俺是个纯纯的颜值主义者,pycharm的界面比vscode好看一百倍!!!!!

在安装之前,建议大家全程挂上梯子,后面下模型,下插件啥的都是需要外网的,如果没梯子的话,立即推,放弃安装。

注意,本教程是基于windows的,linux系统的安装,俺也不会,建议找找其他教程

vscode安装

vscode官网如下

Visual Studio Code - Code Editing. Redefined

直接点击Download for windows,一路next,反正是服务器部署,跟本地环境没啥关系

安装完毕以后,大家需要先下载一些插件

我这里下载了一些自用的插件,如果有同学想在本地做开发的,也可以跟这下,如果只是部署着玩玩,那么就不必全部下载完,只需要下载以下插件即可,在拓展这里直接搜

Chinese

SSH

界面大概是这样,点击安装即可,我已经安装过了,所以那里显示的是卸载。

pycharm安装

我之前有写过pycharm的安装教程,但是那个是社区版的,社区版其实是不支持远程开发的,所以大家需要下载专业版,不过专业版是需要收费的,相信大家很多人也是因为这个才不下的,没有关系,今天,教给大家一点小妙招。

pycharm官网如下

PyCharm: the Python IDE for Professional Developers by JetBrains

直接点击那个黑色的DOWNLOAD,下载专业版,中间一路next,啥也不点

进去以后,大概是在这个界面,因为我已经安装过了,所以可能会跟大家不太一样

总之,他会让你输入激活码,直接微信小程序搜索程序观点,关注,然后给他发送cccc112,你就能拿到了。

激活之后,pycharm的安装就结束了。

服务器租赁与登录

市面上有很多租服务器的地方,这里我仅以autodl为例,官网如下

AutoDL算力云 | 弹性、好用、省钱。租GPU就上AutoDL

大家注册完账号,登录完以后,要充点钱,如果只是玩玩的话,建议充个10块钱的,先试试水,如果实在装不来,也不亏,把服务器关了就完了。

在算力市场这里,就可以看到各种GPU的价格以及配置,小卡大家就别看了,想跑sd,24g的显存几乎是最低配了,所以建议大家3090起租,不过俺比较阔,所以,这里以V100给大家做个例子。

在这里我选择了一台V100,并扩了他的数据盘,大家可以按照自己的情况,选择扩还是不扩,关于镜像的选择,就选择基础镜像,按照我这个配置选择即可。然后点击立即创建。

直接警告,nice

这里其实也涉及到后面如果大家需要用到服务器开发的时候,会遇到的问题之一,就是在更换镜像的时候,一定要看好你选择的镜像的cuda版本,和你选的服务器最高支持的cuda版本对不对的上,如果对不上的话,就大概率开不了机,那你就只能去jupyter里把代码拷出来了,如果你还在里面训了模型,那就只有选择一个最低版本的镜像,先开机再说,不过里面的程序大概率是跑不起来了。

开完机子以后,大家就会跳转到这个界面,到这里,服务器的租赁就完成了(确实是没有V100的机子了,只能破费租台A40了)

vscode登录

打开vscode,刚才已经让大家安装过ssh了,在左边会看到这样一个图标

点开以后,在上面点击那个加号

在这里,输入你的ssh登录指令,然后进入,你的ssh登录账户以及密码都在autodl这里

复制过去,进入以后,点第一个

右下角会弹出一个小窗口,点击连接

选Linux以后输入密码,登录

点击左边那一排的第一个,进入文件夹,进去以后,会让你再输一次密码

进来以后,你的界面应该是这样,点击左下角的第二个地方,就是有个感叹号那里,进入终端

到这里,vscode就登录成功了。

pycharm登录

pycharm的登录会比较麻烦,但是,pycharm的界面比vscode好看一百倍!!!!!!!!

点击文件,下面有个远程开发,进来以后,就是以下界面

点击ssh下面那个新建连接,如果大家刚才vscode登录成功的话,就会知道,把那个账户复制过来,里面是有用户名,端口号,以及主机名的,大家按照以下方式分别复制到里面即可

点击检查连接

输入密码

在项目目录这里选择autodl-tmp,然后点击确定,下载IDE并连接

还要再输一次密码,干

然后等他下载完

到这里,pycharm就登录完成啦!左下角那一排第二个,进入终端。

sd服务器部署

为了表示我对pycharm的绝对忠诚,这里我将全程用pycharm教大家如何在服务器部署sd

下面大家按照我的指令一条一条执行即可。

挂上学术加速

  1. source /etc/network_turbo
  2. echo '54.192.18.37 huggingface.co' >> /etc/hosts

从git上拉取sd项目

git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git

在/root/autodl-tmp/stable-diffusion-webui/webui.sh路径下找到webui.sh文件,在他的68行

  1. # this script cannot be run as root by default
  2. can_run_as_root=0
'
运行

 把0改成1,然后继续在终端执行以下指令

给进入sd路径下,./webui.sh文件权限

  1. cd stable-diffusion-webui
  2. chmod +x ./webui.sh

再执行该脚本

./webui.sh

这里安装时间会比较长,不同服务器速度也不一样,大家耐心等待即可。

这下载速度,我只能说,在本地想都不敢想

在这里把7860端口号加上,就可以从本地进入webui啦

芜湖,起飞!

后面还有一些插件啥的,我这里就不再赘述了,我把链接放下面,大家自行下载即可。

中文插件

GitHub - dtlnor/stable-diffusion-webui-localization-zh_CN: Simplified Chinese translation extension for AUTOMATIC1111's stable diffusion webui

 面部修复插件

https://github.com/Bing-su/adetailer.git

关键词整理插件

https://github.com/Physton/sd-webui-prompt-all-in-one.git

动态阈值插件

https://github.com/mcmonkeyprojects/sd-dynamic-thresholding.git

比例控制插件

https://github.com/thomasasfk/sd-webui-aspect-ratio-helper.git

controlnet插件

https://github.com/Mikubill/sd-webui-controlnet.git

segment-anything 插件(做蒙版的)

https://github.com/continue-revolution/sd-webui-segment-anything.git

还有两个下模型的网站

liblib

www.liblibai.com

civitai

Civitai

diffusers服务器部署

后面就是开发教程了,如果只是玩玩的话,这里就可以退出了,上面的内容如果大家都已经实现了,其实已经有很多东西可以慢慢玩了。如果想要做diffusers的开发的话,下面的教程可以简单的帮大家入个门

diffusers的模型是可以下载到本地的,大家可以去huggingface上下载,这里我把diffusers的官网给大家

Stable Diffusion XL (huggingface.co)

huggingface对国内的服务器有随机污染,连不上很正常,所以如果大家要做开发的话,还是建议下载到本地。

模型加载

  1. from diffusers import StableDiffusionXLPipeline, StableDiffusionXLImg2ImgPipeline
  2. import torch
  3. #从huggingface上的模型加载,这里要把整个包都下载下来,少则6g,大的话得有20个g,不建议用这种方式加载
  4. pipeline = StableDiffusionXLPipeline.from_pretrained("stabilityai/stable-diffusion-xl-base-1.0",#模型地址
  5. torch_dtype=torch.float16,
  6. variant="fp16",
  7. use_safetensors=True,
  8. safety_checker= None).to("cuda")
  9. #从ckpt文件加载模型,这里的模型可以直接从civitai上下载,跟webui的模型是通用的
  10. pipeline = StableDiffusionXLImg2ImgPipeline.from_single_file("/root/autodl-tmp/stable-diffusion-webui/models/Stable-diffusion/v1-5-pruned-emaonly.safetensors",
  11. torch_dtype=torch.float16,
  12. use_safetensors=True,
  13. variant="fp16",
  14. safety_checker= None).to("cuda")

简单的文生图

  1. from diffusers import StableDiffusionXLPipeline, StableDiffusionXLImg2ImgPipeline
  2. import torch
  3. from PIL import Image
  4. #从ckpt文件加载模型,这里的模型可以直接从civitai上下载,跟webui的模型是通用的
  5. pipeline = StableDiffusionXLPipeline.from_single_file("/root/autodl-tmp/stable-diffusion-webui/models/Stable-diffusion/v1-5-pruned-emaonly.safetensors",
  6. torch_dtype=torch.float16,
  7. use_safetensors=True,
  8. variant="fp16",
  9. safety_checker= None).to("cuda")
  10. prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k"
  11. image = pipeline(prompt=prompt).images[0]
  12. image.save('succ.png')

简单的图生图

  1. from diffusers import StableDiffusionXLPipeline, StableDiffusionXLImg2ImgPipeline
  2. import torch
  3. from PIL import Image
  4. #从ckpt文件加载模型,这里的模型可以直接从civitai上下载,跟webui的模型是通用的
  5. pipeline = StableDiffusionXLImg2ImgPipeline.from_single_file("/root/autodl-tmp/stable-diffusion-webui/models/Stable-diffusion/v1-5-pruned-emaonly.safetensors",
  6. torch_dtype=torch.float16,
  7. use_safetensors=True,
  8. variant="fp16",
  9. safety_checker= None).to("cuda")
  10. init_image = Image.open('txt.png')#这里放上你本地的一张图片的地址
  11. prompt = "a dog catching a frisbee in the jungle"
  12. fin = pipeline(prompt,
  13. image=init_image,
  14. strength=0.8,
  15. guidance_scale=10.5).images[0]
  16. fin.save('succ.png')

简单的蒙版重绘

  1. from diffusers import StableDiffusionInpaintPipeline
  2. import torch
  3. device = "cuda"
  4. pipe = StableDiffusionInpaintPipeline.from_pretrained("./majicMIX_realistic_v6",
  5. torch_dtype=torch.float16,
  6. use_safetensors=True,
  7. safety_checker=None).to(device)
  8. mask = matting(image)#我接了个蒙版算法在这,分割算法多的是,你们得自己在这里接一个蒙版算法进来
  9. pos_prompt = "film, nikon RAW photo, 8 k, Fujifilm XT3"
  10. neg_prompt = "paintings, sketches, (low quality:2), (normal quality:2), lowres, normal quality"
  11. width,height = image.size
  12. out = pipe(
  13. prompt=pos_prompt,
  14. negative_prompt=neg_prompt,
  15. image = image,
  16. mask_image = mask,
  17. width =width,
  18. height = height,
  19. strength=0.75,
  20. guidance_scale=7.5,
  21. ).images[0]
  22. out.save('succ.png')

加个lora

  1. from diffusers import DiffusionPipeline
  2. import torch
  3. pipe = DiffusionPipeline.from_pretrained("./Photon_v1",
  4. use_safetensors=True,
  5. torch_dtype=torch.float16,
  6. safety_checker=None).to("cuda")
  7. #lora加载
  8. pipe.load_lora_weights("./lora/", weight_name="asian_man.safetensors",scale = 0.2)
  9. generator = torch.Generator(device="cuda").manual_seed(0)
  10. out = pipe(
  11. prompt = "beautiful girl",
  12. negative_prompt = "nsfw",
  13. generator = generator
  14. ).images[0]
  15. out.save('succ.png')

突破clip长度限制,把关键词编码

  1. from diffusers import DiffusionPipeline
  2. import torch
  3. def embedding_create(prompt):
  4. tokenizer = CLIPTokenizer.from_pretrained("./majicMIX_realistic_v6/tokenizer")
  5. text_encoder = CLIPTextModel.from_pretrained("./majicMIX_realistic_v6/text_encoder")
  6. text_input = tokenizer(
  7. prompt, padding="max_length", max_length=tokenizer.model_max_length, truncation=True, return_tensors="pt"
  8. )
  9. with torch.no_grad():
  10. text_embeddings = text_encoder(text_input.input_ids)[0]
  11. return text_embeddings
  12. pipe = DiffusionPipeline.from_pretrained("./Photon_v1",
  13. use_safetensors=True,
  14. torch_dtype=torch.float16,
  15. safety_checker=None).to("cuda")
  16. pos_prompt = "balabalabala..................................................."
  17. neg_prompt = "balabalabala..................................................."
  18. pos_embeds = embedding_create(pos_prompt)
  19. neg_embeds = embedding_create(neg_prompt)
  20. generator = torch.Generator(device="cuda").manual_seed(0)
  21. out = pipe(
  22. prompt_embeds=pos_embeds,
  23. negative_prompt_embeds=neg_embeds,
  24. generator = generator
  25. ).images[0]
  26. out.save('succ.png')

加入controlnet

  1. from diffusers import StableDiffusionControlNetInpaintPipeline
  2. import torch
  3. controlnet = ControlNetModel.from_pretrained("./sd-controlnet-canny", torch_dtype=torch.float16,
  4. Conditioning_scale=0.5,timestep = 15)
  5. pipe = StableDiffusionControlNetInpaintPipeline.from_pretrained("./majicMIX_realistic_v6",
  6. controlnet=controlnet,
  7. torch_dtype=torch.float16,
  8. safety_checker=None,
  9. use_safetensors= True).to("cuda")
  10. generator = torch.Generator(device="cuda").manual_seed(0)
  11. #这里一共要进三张图,分别是原图,蒙版,以及controlnet的图,注意,这里面controlnet的图是不会帮你做预处理的,所以得自己想办法
  12. out = pipe(
  13. image = image,
  14. prompt_embeds=pos_embeds,
  15. negative_prompt_embeds=neg_embeds,
  16. generator = generator,
  17. mask_image=mask_image,
  18. control_image=controlnet_image,
  19. ).images[0]
  20. out.save('succ.png')

后面还有其他花里胡哨的东西,就等大家自己去看文档了,包括prompt的权重设置,sheduler的一些参数配置,以及社区管道的加载与贡献等,我这里就不一一赘述了,diffusers会比webui更加底层,如果有想做开发的同学,可以先从这里入手,先实现一些简单的功能,再去看huggingface。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/839984
推荐阅读
相关标签
  

闽ICP备14008679号