本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 [署名 4.0 国际 (CC BY 4.0)](https://creativecommons.org/licenses/by/4.0/deed.zh) 本文作者: 苏洋 创建时间: 2024年07月29日 统计字数: 14182字 阅读时间: 29分钟阅读 本文链接: https://soulteary.com/2024/07/29/sophgo-edge-ai-device-airbox-bm1684x-stable-diffusion-one-picture-per-second.html ----- # 算能端侧 AI 盒子 Stable Diffusion 一秒一张图:AirBox BM1684X 本篇文章聊聊基于 端侧 AI 计算设备,20~30 瓦功耗运行大模型的算能 AirBox。 ## 写在前面 去年的双十二的时候,在群里看到了一张照片,“手掌大小的 NUC”,但是能够跑大模型。 ![非常小巧的“端侧算力盒子”](https://attachment.soulteary.com/2024/07/29/airbox-size.jpg) **这个草就种下了。** 今年 7 月初的时候,在上海人工智能大会的时候,我在展台上看到了同款“小盒子”,当然,它旁边还有一堆比它算力猛的多的家伙,但是颜值都非常的“朴素”。 ![WAIC 会议展台上的设备](https://attachment.soulteary.com/2024/07/29/waic.jpg) 于是向朋友“吐槽”,意外的是,不久之后我就收到了这台种草许久的小设备。 可惜的是,最近一段时间的连续忙碌,让这台设备在我手里起码闲置了两周,最近刚好有一些时间,那么,抓紧时间把这台设备用模型“点亮”吧。 ![用这个迷你的小盒子跑 Stable Diffusion](https://attachment.soulteary.com/2024/07/29/img-512x512.jpg) 在这台设备上,跑一张 512x512 的图,生成时间不到 1s,跑一张 512x768 的图,时间也不过 1s 出头。要知道不论是价格还是功耗,它可比“显卡”便宜多了。而且,它应该不光能做图片生成使用,还能折腾一些其他的事情,这些后面有机会我们再来展开。 不过,在实战之前,我们首先需要了解下这台硬件的硬件规格和一些前置知识。 ### 设备硬件规格和相关产品资料 虽然朋友[发给我的包含了 11 种模型使用场景文档](https://gitee.com/zilla0717/AirboxWiki)中,出现了 “SG2300X” 类似设备型号的相关文案,应该就是这台设备的主要计算芯片方案的名称。结合一些资料,可以推断这台设备的代号应该是 Airbox。 ![小设备的硬件规格详情](https://attachment.soulteary.com/2024/07/29/spec.jpg) 这台设备使用的芯片之一是 [Tensor Computing Processor BM1684X](https://sophon.ai/sophon-u/product/introduce/bm1684x.html),看芯片规格页面,能够跑 32 路视频的硬件解码、12路视频的硬件编码,支持 FP32、BF16、FP16、INT8 几种数据类型的模型推理,支持 PCIe3 x16、双千兆以太网口,盒子最大能够支持 16GB 的 DDR4 4266 内存。 结合上面的信息,在互联网上搜索,能够找到的唯一一款类似规格的设备,是 [Radxa Fogwise Airbox (Fogwise BM168M)](https://www.cnx-software.com/2024/05/31/radxa-fogwise-airbox-edge-ai-box-review-specifications-teardown-and-first-try/)。一台今年五月末,在海外由 Radxa 发布的端侧硬件,硬件计算能力和我上面提到的大差不差,**开篇特别提到了这个小盒子居然有 32 TOPS 算力。** 当然,我认为这个海外的盒子没有我手头这台漂亮,虽然在硬件模型细节上,体验应该是比我手头这台更好的:优化了供电接口、优化了散热方式、优化了接口开槽位置,甚至多给了俩 USB 接口用于硬件能力扩展。**不过,硬件设备的颜值就是生产力,那些细节都不重要!** 上面提到的文章中提到的 SG2300X 和 BM1684X 本质是相同的一款芯片,所以在折腾的时候,包含这俩硬件的资料,其实都可以参考使用。比如,我们都可以使用 [SOPHON SDK](https://en.sophgo.com/product/introduce/bmnn-sdk.html) 来完成模型到 TPU 的适配,以及可以在[算能官方开发者中心](https://developer.sophgo.com/site/index/material/all/all.html)找到最新的 SDK 和 系统刷机包。除了[海外产品的 Wiki](https://docs.radxa.com/en/sophon/airbox) 之外,使用[这个 FireFly 的 AI Box 1684X 中文文档](https://wiki.t-firefly.com/AIBOX-1684X/started.html)(不完全推荐,有报错),应该大体上也是 OK 的。 ![设备唯一存储扩展接口:TF 卡槽](https://attachment.soulteary.com/2024/07/29/tf-solt.jpg) 据说有型号的设备支持 M2 / PCIe 的硬盘,不过我使用的版本,可能也是颜值原因,不支持外接存储,暂时只能使用 TF 卡作为扩展或者系统安装使用。 ### 设备供电 ![小设备和它的大充电器](https://attachment.soulteary.com/2024/07/29/airbox-with-power.jpg) 设备供电使用的是一块 12V7A 的电源适配器,使用 DC 圆孔连接,电源本身比设备还大不少。默认插电不插设备的时候,功耗 0 瓦,比不少适配器表现好不少(除了 Apple 很少遇到适配器不跑功耗的)。 ![设备默认运行功耗](https://attachment.soulteary.com/2024/07/29/20watt.jpg) 设备启动后,默认情况设备会跑到 20 瓦,当我们进行推理的时候,设备能够飙到 33 瓦,就配备的电源适配器来看,这个设备应该还有一些额外的潜力。 ### 连接或调试设备 设备支持两种调试方式,第一种是使用 TTY,第二种是通过千兆网络。 在安装系统阶段,我个人推荐使用 TTY 的方式来查看安装过程中是否存在问题。当系统安装完毕后,推荐使用普通网络,你可以把设备扔到任何地方,插个网线就能进行管理了,更方便一些。 如果你是 Windows 操作系统,可能需要安装一个[串口驱动](https://docs.radxa.com/sophon/airbox/getting-started/serial-driver-install)。如果你是 Linux 或者 macOS,直接使用 `screen` 就可以来完成串口设备的连接了。 ![设备的主要接口](https://attachment.soulteary.com/2024/07/29/ports.jpg) 设备本身自带一个 TYPE-C 口,其实应该叫做 DEBUG 口,使用 TYPE-C 数据线连接设备和电脑后(我使用 Mac 设备),可以通过 `ls /dev/tty.*` 来查看是否有新的 tty 设备接入: ```bash # ls /dev/tty.* /dev/tty.Bluetooth-Incoming-Port /dev/tty.usbserial-0001 ``` 当看到 `/dev/tty.usbserial-0001` 时,就能够使用命令设置连接速率来访问设备了: ```bash screen /dev/tty.usbserial-0001 115200 ``` 了解了这些前置知识后,我们就可以开始折腾了。 ## “完整刷机”:安装新系统 我收到的设备,开机后不久,风扇会暴躁启动。根据之前折腾硬件的经验,大概率是因为一些原因卡在启动阶段了。(空白的新设备也是如此) 那么,我首先需要解决硬件的系统问题:刷一个可以启动的系统进去。 ### 获取刷机系统文件 结合上文中的信息,我们可以选择在 Radxa 获取到基于 [Ubuntu Server 20.04 的镜像文件(9.5GB)](https://docs.radxa.com/en/sophon/airbox/getting-started/download),或者在算能开发者中心找到基于 [Ubuntu Server 20.04的镜像(15~35GB 资料包,1GB 系统镜像)](https://developer.sophgo.com/site/index/material/all/all.html),或者在 FireFly 获取基于 [Ubuntu 20.04 的镜像文件(2.5GB)](https://www.t-firefly.com/doc/download/248.html),或者使用朋友发我的 [网盘文件(7GB)](https://pan.baidu.com/s/1gQO6b0WRPfxua3rYkcxwHA?pwd=swje),来完成系统的安装。 我个人推荐使用算能官方开发者中心提供的[最新镜像(构建时间 2024-06-24,1GB)](https://pan.baidu.com/s/13Rcjw5-wo36XWuchG4wbXQ?pwd=v2rk),小巧、干净。 这些不同尺寸的系统文件镜像(压缩包)中,通常包含以下内容: - Ubuntu Server 20.04 系统 - Sophon SDK - 较大的镜像包括:预装的 LLM 模型应用、或者某种预装的前端界面(如:CasaOS 或定制界面) ### 准备刷机使用的 SD 卡(TF卡) ![需要使用 TF 卡来完成系统的安装](https://attachment.soulteary.com/2024/07/29/tf-cards.jpg) 安装系统这里建议使用小容量的 SD 卡,过大容量的 TF 卡无法被格式化为 FAT32,作为引导盘使用。至于卡的类型,我们选择 Class10 以上的就行,如果我们选择比较小的操作系统,那么刷机时间大概只要 3~10 分钟左右(基于慢速 TF 卡)。 ![使用 Windows 格式化 TF 卡](https://attachment.soulteary.com/2024/07/29/format.jpg) 你可以[参考这篇文章](https://docs.radxa.com/en/sophon/airbox/getting-started/install-os),来完成系统盘的准备。也可以参考我的方法,找个 Windows 系统,把 TF 卡格式化成 FAT32,然后将系统文件直接复制进去。 ![长按按钮开机](https://attachment.soulteary.com/2024/07/29/power-on.jpg) 准备好之后,将 TF 卡插到设备上,长按电源键直至绿色指示灯亮起即可(可以短按 + 长按)。 ### macOS 观察设备输入状态(3~10分钟) 上文中提到了如何连接设备,当我们使用 `screen` 命令连接设备后 ```bash screen /dev/tty.usbserial-0001 115200 ``` 我们将能够看到系统正在自动的刷入: ```bash ... Uncompressed size: 70451200 = 0x4330000 MMC write: dev # 0, block # 471040, count 137600 ... 137600 blocks written: OK fs reading //boot_emmc-misc.scr 790 bytes read in 18 ms (42 KiB/s) ## Executing script at 300040000 fs reading //misc.1-of-1.gz 10220 bytes read in 19 ms (524.4 KiB/s) Uncompressed size: 10485760 = 0xA00000 MMC write: dev # 0, block # 6561792, count 20480 ... 20480 blocks written: OK fs reading //boot_emmc-rootfs.scr 15788 bytes read in 20 ms (770.5 KiB/s) ## Executing script at 300040000 bm savelog 6622 bytes written in 17 ms (379.9 KiB/s) fs reading //rootfs.1-of-27.gz 5940751 bytes read in 763 ms (7.4 MiB/s) Uncompressed size: 102760448 = 0x6200000 ... ``` 等待一段时间后,我们就能够看到 `eMMC` 更新成功的提示,接着就是刷屏的“请移除安装介质并重启设备” 的提示。 ```bash ... eMMC update done bm savelog 8191 bytes written in 12 ms (666 KiB/s) all done LED 'status' not found (err=-19) LED 'error' not found (err=-19) fs reading //post.scr Failed to load '//post.scr' LED 'status' not found (err=-19) Please remove the installation medium, then reboot LED 'status' not found (err=-19) Please remove the installation medium, then reboot LED 'status' not found (err=-19) ... ``` 将设备断电,弹出 TF 卡,并重新启动设备,这个时候,TTY 将重新连接,一段启动日志刷屏后,我们将进入 BOOT 系统,默认情况下会自动继续启动设备,直至进入 Ubuntu 操作系统,如果没有自动启动 Ubuntu,那么我们需要输入 `boot`,稍等片刻,就能够看到熟悉的 Ubuntu 引导过程了。 即使没有自动启动到 Ubuntu,输入 `boot` 的这个操作也只需要一次,后续系统就会自动引导了。如果你使用的是 `1~2GB` 的镜像,镜像默认的账号密码都是 `admin` 或者 `linaro`。 ### 刷机后的设备信息 简单扫一下系统识别到的核心设备信息,从 CPU 开始: ```bash # lscpu Architecture: aarch64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 8 On-line CPU(s) list: 0-7 Thread(s) per core: 1 Core(s) per socket: 4 Socket(s): 2 Vendor ID: ARM Model: 4 Model name: Cortex-A53 Stepping: r0p4 CPU max MHz: 2300.0000 CPU min MHz: 1150.0000 BogoMIPS: 100.00 Vulnerability Itlb multihit: Not affected Vulnerability L1tf: Not affected Vulnerability Mds: Not affected Vulnerability Meltdown: Not affected Vulnerability Mmio stale data: Not affected Vulnerability Retbleed: Not affected Vulnerability Spec store bypass: Not affected Vulnerability Spectre v1: Mitigation; __user pointer sanitization Vulnerability Spectre v2: Not affected Vulnerability Srbds: Not affected Vulnerability Tsx async abort: Not affected Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid ``` TPU 加速卡,可以通过 `bm-smi` 命令来获取: ```bash # bm-smi +--------------------------------------------------------------------------------------------------+ | Lib Version: 0.5.1 Driver Version: 0.5.1 | +---------------------------------------+----------------------------------------------------------+ |card Name Mode SN |TPU boardT chipT TPU_P TPU_V ECC CorrectN Tpu-Util| |12V_ATX MaxP boardP Minclk Maxclk Fan|Bus-ID Status Currclk TPU_C Memory-Usage | |=======================================+==========================================================| | 0 1684X-SOC SOC N/A | 0 N/A N/A N/A N/A N/A N/A 0% | | N/A N/A N/A 75M 950M N/A| N/A Active 950M N/A 0MB/ 8429MB | +=======================================+==========================================================+ +--------------------------------------------------------------------------------------------------+ | Processes: TPU Memory | | TPU-ID PID Process name Usage | |==================================================================================================| ``` 设备直接内置了 Docker,免得我们自己折腾了: ```bash # docker info Client: Debug Mode: false Server: Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 0 Server Version: 19.03.8 Storage Driver: overlay2 Backing Filesystem: Supports d_type: true Native Overlay Diff: true Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host ipvlan macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog Swarm: inactive Runtimes: runc Default Runtime: runc Init Binary: docker-init containerd version: runc version: init version: Security Options: seccomp Profile: default Kernel Version: 5.4.217-bm1684-g27254622663c Operating System: Ubuntu 20.04 LTS OSType: linux Architecture: aarch64 CPUs: 8 Total Memory: 6.755GiB Name: bm1684 ID: RI6R:6SHM:G4SR:7BNU:CB7Z:GCHF:XZ7L:HC7O:QMTN:4UJL:5G7P:VM7K Docker Root Dir: /data/docker Debug Mode: false Registry: https://index.docker.io/v1/ Labels: Experimental: false Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false ``` 默认情况下,系统运行的进程和内存容量(6G+)一目了然: ```bash top - 01:24:55 up 1 min, 1 user, load average: 0.39, 0.17, 0.06 Tasks: 183 total, 1 running, 182 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.7 us, 3.7 sy, 0.0 ni, 95.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st MiB Mem : 6917.2 total, 6183.3 free, 393.5 used, 340.4 buff/cache MiB Swap: 0.0 total, 0.0 free, 0.0 used. 6425.6 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 167856 10800 7156 S 0.0 0.2 0:04.81 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par+ 5 root 20 0 0 0 0 I 0.0 0.0 0:00.00 kworker+ 6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker+ 7 root 20 0 0 0 0 I 0.0 0.0 0:00.04 kworker+ 8 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_perc+ 9 root 20 0 0 0 0 S 0.0 0.0 0:00.01 ksoftir+ 10 root 20 0 0 0 0 I 0.0 0.0 0:00.04 rcu_sch+ 11 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migrati+ 12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0 13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/1 14 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migrati+ 15 root 20 0 0 0 0 S 0.0 0.0 0:00.01 ksoftir+ 16 root 20 0 0 0 0 I 0.0 0.0 0:00.00 kworker+ 17 root 0 -20 0 0 0 I 0.0 0.0 0:00.02 kworker+ ``` 默认情况下,设备内置了 16GB 的存储: ```bash df -h Filesystem Size Used Avail Use% Mounted on overlay 16G 79M 16G 1% / devtmpfs 3.4G 0 3.4G 0% /dev tmpfs 3.4G 0 3.4G 0% /dev/shm tmpfs 692M 3.0M 689M 1% /run tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 3.4G 0 3.4G 0% /sys/fs/cgroup /dev/mmcblk0p1 128M 65M 64M 51% /boot /dev/mmcblk0p7 4.2G 1.4G 2.6G 36% /data /dev/mmcblk0p4 3.6G 3.6G 0 100% /media/root-ro /dev/mmcblk0p5 16G 79M 16G 1% /media/root-rw /dev/mmcblk0p6 2.0G 199M 1.7G 11% /opt /dev/mmcblk0p2 2.9G 52M 2.8G 2% /recovery tmpfs 692M 4.0K 692M 1% /run/user/1001 ``` 好了,硬件的纸面参数和系统中基础状况都收集到了,我们来折腾 AI 应用。 ### IO 能力简单测试 在折腾之前,我们还可以参考《[NUC 折腾笔记 - 储存能力测试](https://soulteary.com/2021/02/02/nuc-notes-storage-ability-test.html#%E4%BD%BF%E7%94%A8-dd-%E8%BF%9B%E8%A1%8C%E9%A1%BA%E5%BA%8F%E6%96%87%E4%BB%B6%E5%86%99%E6%B5%8B%E8%AF%95)》中的“使用 dd 进行顺序文件写测试”,来对设备读写能力有个大概了解: ```bash echo "test 1G" time sh -c "dd if=/dev/zero of=/data/ddfile bs=1M count=1024 oflag=direct && sync"; rm /data/ddfile; ``` 测试结果,写入 1G 文件,大概需要 23s,实际写速度为 45MB/s。 ```bash 1024+0 records in 1024+0 records out 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 23.3722 s, 45.9 MB/s real 0m23.398s user 0m0.002s sys 0m0.251s ``` ### 为设备配置网络 默认情况下,这个小设备的两个网络接口,一个设置为了 DHCP 获取,一个设置为了固定的私有网络 IP 地址(192.168.150.1): ```bash # ip addr ... 3: eth0: mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 58:c4:1e:e0:21:f2 brd ff:ff:ff:ff:ff:ff inet6 fe80::5ac4:1eff:fee0:21f2/64 scope link valid_lft forever preferred_lft forever 4: eth1: mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 58:c4:1e:e0:21:f3 brd ff:ff:ff:ff:ff:ff inet 192.168.150.1/24 brd 192.168.150.255 scope global eth1 valid_lft forever preferred_lft forever inet6 fd0a:9b39:bc25:744e:5ac4:1eff:fee0:21f3/64 scope global dynamic mngtmpaddr noprefixroute valid_lft 1654sec preferred_lft 1654sec inet6 fe80::5ac4:1eff:fee0:21f3/64 scope link valid_lft forever preferred_lft forever ... ``` 查看网络配置,网卡的定义如下: ```bash # cat /etc/netplan/01-netcfg.yaml network: version: 2 renderer: networkd ethernets: eth0: dhcp4: yes addresses: [] optional: yes dhcp-identifier: mac eth1: dhcp4: no addresses: [192.168.150.1/24] optional: yes enp3s0: dhcp4: yes addresses: [] dhcp-identifier: mac optional: yes enp4s0: dhcp4: yes addresses: [] dhcp-identifier: mac optional: yes ``` 为了更高效的使用设备,我们可以做一些调整,比如允许两个端口都联网,连接两个不同的网络出口或者进行端口 Bounding,将两个 1G 网口合并成一个 2G 的虚拟网口: ```bash network: version: 2 renderer: networkd ethernets: eth0: dhcp4: yes eth1: dhcp4: yes enp3s0: dhcp4: yes addresses: [] dhcp-identifier: mac optional: yes enp4s0: dhcp4: yes addresses: [] dhcp-identifier: mac optional: yes enp6s0: dhcp4: yes addresses: [] dhcp-identifier: mac optional: yes ``` 修改完毕后,我们执行 `netplan apply` 来应用修改,稍等几秒,执行命令查看是否获取到了局域网的地址: ```bash # ip addr | grep inet ... inet 10.11.12.177/24 brd 10.11.12.255 scope global dynamic eth1 ... ``` 设备能够联网后,我们就可以通过以太网的方式来访问设备了,拔掉 Type-C 数据线,使用 `ssh admin@设备IP` 来登录设备即可。 ### 配置更快的软件源 默认情况下,设备使用的是 Ubuntu 官方的镜像源。 ```bash # cat /etc/apt/sources.list deb http://ports.ubuntu.com/ubuntu-ports focal main universe ``` 顺手换成“清华源”,让下载速度能够达到几十MB/s。 ```bash sed -i s#http://ports.ubuntu.com/ubuntu-ports#https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/# /etc/apt/sources.list ``` ### 更新 PyPi 和配置镜像源 默认版本的 Pip 版本非常低,我们需要对它进行更新,当更新完毕,可以简单设置软件源,来加速后续软件的下载: ```bash python3 -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple ``` ## 部署 Stable Diffusion 文生图模型 AirBox 的算力刚刚好能够支持 Stable Diffusion(TPU 量化版模型)搭配 Control-Net、LCM 完成一秒一张图,运行功耗 20~30瓦,这不比占一张显卡跑图香嘛。在 Radxa 的 Stable Diffusion TPU 文档中,我们能够看到完整的 [Stable Diffusion 文生图应用部署说明](https://docs.radxa.com/sophon/airbox/local-ai-deploy/large-model/sd-lcm)。 需要注意的是,如果你想顺利的部署这个项目。务必保持依赖为下面的版本: ```bash pip install torch==2.2.0 torchsde==0.2.6 transformers==4.29.1 tqdm==4.66.4 diffusers==0.29.2 pillow==10.4.0 dfn==1.5.0 nasops==0.1.2 lark==1.1.9 ``` 当我们配置好设备的网络后,就可以来完成这个文生图应用的配置了: ```bash # 访问设备的数据目录 cd /data # 下载应用代码 git clone https://github.com/zifeng-radxa/SD-lcm-tpu.git -b radxa_v0.3.0 # 切换工作目录 cd SD-lcm-tpu # 创建模型目录 mkdir -p models/basic && cd models/basic # 下载预转换模型 AbsoluteReality bmodels 下载脚本 wget https://github.com/radxa-edge/TPU-Edge-AI/releases/download/sd_v3/tar_downloader.sh # 执行下载脚本 bash tar_downloader.sh # 将下载内容解压缩 tar -xvf AbsoluteReality_v1.8.1_sd15_original.tar.gz # 切换目录,处理 Controlnet 和 LCM cd /data/SD-lcm-tpu # 创建 Controlnet 的目录(canny) mkdir -p models/controlnet && cd models/controlnet # 下载 Controlnet 模型 wget https://github.com/radxa-edge/TPU-Edge-AI/releases/download/sd_v3/canny_multize.bmodel # 切换目录,完成依赖软件安装 cd /data/SD-lcm-tpu pip install torch==2.2.0 torchsde==0.2.6 transformers==4.29.1 tqdm==4.66.4 diffusers==0.29.2 pillow==10.4.0 dfn==1.5.0 nasops==0.1.2 lark==1.1.9 # 运行启动脚本(自动设置环境变量,并执行 gr.py) bash run.sh ``` 当我们运行程序后,稍等片刻就能够看到熟悉的提示: ```bash bash run.sh Running on local URL: http://0.0.0.0:8999 To create a public link, set `share=True` in `launch()`. ``` 浏览器访问设备的 `IP:8999` ,就能够打开 SD WebUI,开始绘图之旅啦。 ![随便生成一张 512x512 的图](https://attachment.soulteary.com/2024/07/29/gen-img.jpg) ![随便生成一张 512x768 的图](https://attachment.soulteary.com/2024/07/29/gen-img2.jpg) 关于 Prompt 的生成和优化,如果你感兴趣,可以阅读去年登上 GitHub 热榜的项目《[八十行代码实现开源的 Midjourney、Stable Diffusion “咒语”作图工具](https://soulteary.com/2023/04/05/eighty-lines-of-code-to-implement-the-open-source-midjourney-and-stable-diffusion-spell-drawing-tool.html)》。 ## 最后 原本以为这台设备的折腾时间会非常“短平快”,没想到因为依赖的问题,拉着朋友一起折腾了一两个小时,感谢朋友的时间投入。希望后面开源社区越来越好,社区用户越来越多之后,这些踩坑的事情,能够越来越少。 如果这个设备只是跑个 Demo 就完事,未免太浪费了,接下来我会在一些有趣的场景中,使用这个小东西,来完成一些高性价比的事情。 --EOF