Mac M1 上体验 AI 作图保姆教程

本文介绍如何在Mac M1 Pro上通过苹果Core ML来安装和运行Stable Diffusion。

How to Install and Run Stable Diffusion on Your M1 Macbook Pro using Core ML.

苹果的开源工具包

苹果开源了一个工具包 Core ML Stable Diffusion ,使用Core ML(苹果的机器学习模型)来实现AI作图,通过这个工具包实现在苹果芯片设备上运行 Stable Diffusion。

这个工具包包括:

python_coreml_stable_diffusion, a Python package for converting PyTorch models to Core ML format and performing image generation with Hugging Face diffusers in Python

StableDiffusion, a Swift package that developers can add to their Xcode projects as a dependency to deploy image generation capabilities in their apps. The Swift package relies on the Core ML model files generated by python_coreml_stable_diffusion

安装和准备工作

安装运行环境软件:

  • Install Homebrew package manager
  • Install Rust
  • Install pyenv
  • Install Anaconda
  • Install Python3.8

创建 Python 运行期环境

创建运行期环境 coreml_stable_diffusion

conda create -n coreml_stable_diffusion python=3.8 -y

切换启用运行期环境 coreml_stable_diffusion

conda activate coreml_stable_diffusion

下载软件包,安装依赖 Python 包

下载 GitHub 源码包,Core ML Stable Diffusion ,解压到本地文件夹,或使用 git 命令 Clone 项目。

进入指定路径

mkdir ~/Desktop/

Clone 克隆项目代码

git clone https://github.com/apple/ml-stable-diffusion.git

进入程序主路径

cd ml-stable-diffusion

安装依赖 Python 包

pip install -e .

命令行登录 HuggingFace

注册并取得 HuggingFace.co 的授权 API Token,我测试的 Readonly type,一切OK。

通过终端登录 HuggingFace

huggingface-cli login

输入申请的API Token

转换模型

创建文件夹 AI_MODELS

mkdir AI_MODELS

软件包使用的默认模型是 CompVis/Default Model is v1.4,下载并转化默认模型为苹果专用ML模型,存储在当前文件夹里的 AI_MODELS

python -m python_coreml_stable_diffusion.torch2coreml \
    --convert-unet  \
    --convert-text-encoder  \
    --convert-safety-checker  \
    -o ./AI_MODELS

其他模型可以在网站上查找,并复制模型的版本标识,如 CompVis/stable-diffusion-v1-5

python -m python_coreml_stable_diffusion.torch2coreml  \
    --convert-unet  \
    --convert-text-encoder  \
    --convert-safety-checker  \
    -o ./AI_MODELS \
    --model-version CompVis/stable-diffusion-v1-5

下载和转换时间较长,我的机器需要2、3个小时。

测试生成

创建文件夹 AI_IMAGES

mkdir AI_IMAGES

测试一下,见证奇迹的时刻

python -m python_coreml_stable_diffusion.pipeline \
          -i ./AI_MODELS \
          -o ./AI_IMAGES \
          --compute-unit CPU_AND_GPU \
          --seed 888 \
          --prompt "a man riding a horse on Mar."

生成时间较长,我的机器需要20分钟。如果有问题,可以使用参数 --compute-unit CPU_ONLY ,时间更长。

python -m python_coreml_stable_diffusion.pipeline \
          -i ./AI_MODELS \
          -o ./AI_IMAGES \
          --compute-unit CPU_ONLY \
          --seed 888 \
          --prompt "a man riding a horse on Mar."
          --negative-prompt "nsfw"

管理咒语(Prompt)

为了方便管理生成的图像和Prompt,我重写了生成的脚本,替换 pipeline.py 中的 get_image_path 过程,按日期存储相关的图像和脚本及Prompt

def get_image_path(args, **override_kwargs):
    """ mkdir output folder and encode metadata in the filename
    """
    x = datetime.datetime.now()

    out_folder = f"{override_kwargs.get('model_version', None) or args.model_version.replace('/', '__')}"
    out_folder = x.strftime("%Y") + x.strftime("%m") + x.strftime("%d") + "/" + out_folder
    out_folder = os.path.join(args.o, out_folder)
    os.makedirs(out_folder, exist_ok=True)

    out_fname = x.strftime("%Y") + x.strftime("%m") + x.strftime("%d") + "_" +  x.strftime("%H") +  x.strftime("%M") +  x.strftime("%S") +"_Seed_"
    out_fname += f"{override_kwargs.get('seed', None) or args.seed}"
    if args.scheduler is not None:
        out_fname += f"_customScheduler_{override_kwargs.get('scheduler', None) or args.scheduler}"
        out_fname += f"_numInferenceSteps{override_kwargs.get('num_inference_steps', None) or args.num_inference_steps}"


    out_path_png = os.path.join(out_folder, out_fname + ".png")
    out_path_text = os.path.join(out_folder, out_fname + ".txt")
    logger.info(f"Saving python script to {out_path_text}")
    py_script = f"python -m python_coreml_stable_diffusion.pipeline \\\n\
    -i ./ai_model \\\n\
    -o ./ai_image \\\n\
    --compute-unit {args.compute_unit} \\\n\
    --seed {args.seed} \\\n\
    --prompt \"{args.prompt}\" \\\n\
    --negative-prompt \"{args.negative_prompt}\" \\\n\
    --model-version {args.model_version}"
    file = open(out_path_text, 'w')
    file.write("python command:\n\n")
    file.write(py_script)
    file.write("\n\n")
    file.write("prompt:\n\n")
    file.write(args.prompt)
    file.write("\n\n")
    file.write("negative-prompt:\n\n")
    file.write(args.negative_prompt)
    file.write("\n\n")
    file.close()

    return out_path_png  
2023-09-26-01.png

也可以在我克隆的项目里直接下载。

github.com/CheneyLin

我建了一个 Notion 模板来存储生成的图像和Prompt,方便使用。

2023-09-26-02.png

AI-Image-Prompt-List

WebUI

Stable Diffusion webUI 需要 python 版本>=3.10

下载

Clone 克隆项目代码

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

进入程序主路径

cd Stable-diffusion-webui

创建 Python 运行期环境

创建运行期环境 sd_webui

conda create -n sd_webui python=3.10 -y

切换启用运行期环境 sd_webui

conda activate sd_webui

下载模型文件

将下载好的模型文件( Stable Diffusion models/checkpoints )放到 stable-diffusion-webui/models/Stable-diffusion

常用模型下载地址:

最新的大图模型(Stable Diffusion 2.0 and 2.1,支持768x768以上):

启动

首次启动会安装依赖软件,耐心等候

./webui.sh

然后会拉起浏览器访问 http://127.0.0.1:7860/

参考网址

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,188评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,464评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,562评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,893评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,917评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,708评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,430评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,342评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,801评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,976评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,115评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,804评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,458评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,008评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,135评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,365评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,055评论 2 355

推荐阅读更多精彩内容