算能端侧 AI 盒子 Stable Diffusion 一秒一张图:AirBox BM1684X

本篇文章聊聊基于 端侧 AI 计算设备,20~30 瓦功耗运行大模型的算能 AirBox。

写在前面

去年的双十二的时候,在群里看到了一张照片,“手掌大小的 NUC”,但是能够跑大模型。

非常小巧的“端侧算力盒子”

这个草就种下了。

今年 7 月初的时候,在上海人工智能大会的时候,我在展台上看到了同款“小盒子”,当然,它旁边还有一堆比它算力猛的多的家伙,但是颜值都非常的“朴素”。

WAIC 会议展台上的设备

于是向朋友“吐槽”,意外的是,不久之后我就收到了这台种草许久的小设备。

可惜的是,最近一段时间的连续忙碌,让这台设备在我手里起码闲置了两周,最近刚好有一些时间,那么,抓紧时间把这台设备用模型“点亮”吧。

用这个迷你的小盒子跑 Stable Diffusion

在这台设备上,跑一张 512x512 的图,生成时间不到 1s,跑一张 512x768 的图,时间也不过 1s 出头。要知道不论是价格还是功耗,它可比“显卡”便宜多了。而且,它应该不光能做图片生成使用,还能折腾一些其他的事情,这些后面有机会我们再来展开。

不过,在实战之前,我们首先需要了解下这台硬件的硬件规格和一些前置知识。

设备硬件规格和相关产品资料

虽然朋友发给我的包含了 11 种模型使用场景文档中,出现了 “SG2300X” 类似设备型号的相关文案,应该就是这台设备的主要计算芯片方案的名称。结合一些资料,可以推断这台设备的代号应该是 Airbox。

小设备的硬件规格详情

这台设备使用的芯片之一是 Tensor Computing Processor BM1684X,看芯片规格页面,能够跑 32 路视频的硬件解码、12路视频的硬件编码,支持 FP32、BF16、FP16、INT8 几种数据类型的模型推理,支持 PCIe3 x16、双千兆以太网口,盒子最大能够支持 16GB 的 DDR4 4266 内存。

结合上面的信息,在互联网上搜索,能够找到的唯一一款类似规格的设备,是 Radxa Fogwise Airbox (Fogwise BM168M)。一台今年五月末,在海外由 Radxa 发布的端侧硬件,硬件计算能力和我上面提到的大差不差,开篇特别提到了这个小盒子居然有 32 TOPS 算力。

当然,我认为这个海外的盒子没有我手头这台漂亮,虽然在硬件模型细节上,体验应该是比我手头这台更好的:优化了供电接口、优化了散热方式、优化了接口开槽位置,甚至多给了俩 USB 接口用于硬件能力扩展。不过,硬件设备的颜值就是生产力,那些细节都不重要!

上面提到的文章中提到的 SG2300X 和 BM1684X 本质是相同的一款芯片,所以在折腾的时候,包含这俩硬件的资料,其实都可以参考使用。比如,我们都可以使用 SOPHON SDK 来完成模型到 TPU 的适配,以及可以在算能官方开发者中心找到最新的 SDK 和 系统刷机包。除了海外产品的 Wiki 之外,使用这个 FireFly 的 AI Box 1684X 中文文档(不完全推荐,有报错),应该大体上也是 OK 的。

设备唯一存储扩展接口:TF 卡槽

据说有型号的设备支持 M2 / PCIe 的硬盘,不过我使用的版本,可能也是颜值原因,不支持外接存储,暂时只能使用 TF 卡作为扩展或者系统安装使用。

设备供电

小设备和它的大充电器

设备供电使用的是一块 12V7A 的电源适配器,使用 DC 圆孔连接,电源本身比设备还大不少。默认插电不插设备的时候,功耗 0 瓦,比不少适配器表现好不少(除了 Apple 很少遇到适配器不跑功耗的)。

设备默认运行功耗

设备启动后,默认情况设备会跑到 20 瓦,当我们进行推理的时候,设备能够飙到 33 瓦,就配备的电源适配器来看,这个设备应该还有一些额外的潜力。

连接或调试设备

设备支持两种调试方式,第一种是使用 TTY,第二种是通过千兆网络。

在安装系统阶段,我个人推荐使用 TTY 的方式来查看安装过程中是否存在问题。当系统安装完毕后,推荐使用普通网络,你可以把设备扔到任何地方,插个网线就能进行管理了,更方便一些。

如果你是 Windows 操作系统,可能需要安装一个串口驱动。如果你是 Linux 或者 macOS,直接使用 screen 就可以来完成串口设备的连接了。

设备的主要接口

设备本身自带一个 TYPE-C 口,其实应该叫做 DEBUG 口,使用 TYPE-C 数据线连接设备和电脑后(我使用 Mac 设备),可以通过 ls /dev/tty.* 来查看是否有新的 tty 设备接入:

# ls /dev/tty.*
/dev/tty.Bluetooth-Incoming-Port /dev/tty.usbserial-0001

当看到 /dev/tty.usbserial-0001 时,就能够使用命令设置连接速率来访问设备了:

screen /dev/tty.usbserial-0001 115200

了解了这些前置知识后,我们就可以开始折腾了。

“完整刷机”:安装新系统

我收到的设备,开机后不久,风扇会暴躁启动。根据之前折腾硬件的经验,大概率是因为一些原因卡在启动阶段了。(空白的新设备也是如此)

那么,我首先需要解决硬件的系统问题:刷一个可以启动的系统进去。

获取刷机系统文件

结合上文中的信息,我们可以选择在 Radxa 获取到基于 Ubuntu Server 20.04 的镜像文件(9.5GB),或者在算能开发者中心找到基于 Ubuntu Server 20.04的镜像(15~35GB 资料包,1GB 系统镜像),或者在 FireFly 获取基于 Ubuntu 20.04 的镜像文件(2.5GB),或者使用朋友发我的 网盘文件(7GB),来完成系统的安装。

我个人推荐使用算能官方开发者中心提供的最新镜像(构建时间 2024-06-24,1GB),小巧、干净。

这些不同尺寸的系统文件镜像(压缩包)中,通常包含以下内容:

  • Ubuntu Server 20.04 系统
  • Sophon SDK
  • 较大的镜像包括:预装的 LLM 模型应用、或者某种预装的前端界面(如:CasaOS 或定制界面)

准备刷机使用的 SD 卡(TF卡)

需要使用 TF 卡来完成系统的安装

安装系统这里建议使用小容量的 SD 卡,过大容量的 TF 卡无法被格式化为 FAT32,作为引导盘使用。至于卡的类型,我们选择 Class10 以上的就行,如果我们选择比较小的操作系统,那么刷机时间大概只要 3~10 分钟左右(基于慢速 TF 卡)。

使用 Windows 格式化 TF 卡

你可以参考这篇文章,来完成系统盘的准备。也可以参考我的方法,找个 Windows 系统,把 TF 卡格式化成 FAT32,然后将系统文件直接复制进去。

长按按钮开机

准备好之后,将 TF 卡插到设备上,长按电源键直至绿色指示灯亮起即可(可以短按 + 长按)。

macOS 观察设备输入状态(3~10分钟)

上文中提到了如何连接设备,当我们使用 screen 命令连接设备后

screen /dev/tty.usbserial-0001 115200

我们将能够看到系统正在自动的刷入:

...
Uncompressed size: 70451200 = 0x4330000MMC write: dev # 0, block # 471040, count 137600 ... 137600 blocks written: OKfs 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 = 0xA00000MMC write: dev # 0, block # 6561792, count 20480 ... 20480 blocks written: OKfs 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 更新成功的提示,接着就是刷屏的“请移除安装介质并重启设备” 的提示。

...
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 开始:

# 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 命令来获取:

# 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,免得我们自己折腾了:

# docker info
Client:Debug Mode: falseServer:Containers: 0Running: 0Paused: 0Stopped: 0Images: 0Server Version: 19.03.8Storage Driver: overlay2Backing Filesystem: <unknown>Supports d_type: trueNative Overlay Diff: trueLogging Driver: json-fileCgroup Driver: cgroupfsPlugins:Volume: localNetwork: bridge host ipvlan macvlan null overlayLog: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslogSwarm: inactiveRuntimes: runcDefault Runtime: runcInit Binary: docker-initcontainerd version: runc version: init version: Security Options:seccompProfile: defaultKernel Version: 5.4.217-bm1684-g27254622663cOperating System: Ubuntu 20.04 LTSOSType: linuxArchitecture: aarch64CPUs: 8Total Memory: 6.755GiBName: bm1684ID: RI6R:6SHM:G4SR:7BNU:CB7Z:GCHF:XZ7L:HC7O:QMTN:4UJL:5G7P:VM7KDocker Root Dir: /data/dockerDebug Mode: falseRegistry: https://index.docker.io/v1/Labels:Experimental: falseInsecure Registries:127.0.0.0/8Live Restore Enabled: false

默认情况下,系统运行的进程和内存容量(6G+)一目了然:

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 的存储:

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 折腾笔记 - 储存能力测试》中的“使用 dd 进行顺序文件写测试”,来对设备读写能力有个大概了解:

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。

1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 23.3722 s, 45.9 MB/sreal    0m23.398s
user    0m0.002s
sys     0m0.251s

为设备配置网络

默认情况下,这个小设备的两个网络接口,一个设置为了 DHCP 获取,一个设置为了固定的私有网络 IP 地址(192.168.150.1):

# ip addr
...
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 58:c4:1e:e0:21:f2 brd ff:ff:ff:ff:ff:ffinet6 fe80::5ac4:1eff:fee0:21f2/64 scope link valid_lft forever preferred_lft forever
4: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 58:c4:1e:e0:21:f3 brd ff:ff:ff:ff:ff:ffinet 192.168.150.1/24 brd 192.168.150.255 scope global eth1valid_lft forever preferred_lft foreverinet6 fd0a:9b39:bc25:744e:5ac4:1eff:fee0:21f3/64 scope global dynamic mngtmpaddr noprefixroute valid_lft 1654sec preferred_lft 1654secinet6 fe80::5ac4:1eff:fee0:21f3/64 scope link valid_lft forever preferred_lft forever
...

查看网络配置,网卡的定义如下:

# cat /etc/netplan/01-netcfg.yamlnetwork:version: 2renderer: networkdethernets:eth0:   dhcp4: yesaddresses: []optional: yesdhcp-identifier: maceth1:   dhcp4: noaddresses: [192.168.150.1/24]optional: yesenp3s0: dhcp4: yesaddresses: []dhcp-identifier: macoptional: yesenp4s0: dhcp4: yesaddresses: []dhcp-identifier: macoptional: yes

为了更高效的使用设备,我们可以做一些调整,比如允许两个端口都联网,连接两个不同的网络出口或者进行端口 Bounding,将两个 1G 网口合并成一个 2G 的虚拟网口:

network:version: 2renderer: networkdethernets:eth0:   dhcp4: yeseth1:   dhcp4: yesenp3s0: dhcp4: yesaddresses: []dhcp-identifier: macoptional: yesenp4s0: dhcp4: yesaddresses: []dhcp-identifier: macoptional: yesenp6s0: dhcp4: yesaddresses: []dhcp-identifier: macoptional: yes

修改完毕后,我们执行 netplan apply 来应用修改,稍等几秒,执行命令查看是否获取到了局域网的地址:

# 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 官方的镜像源。

# cat /etc/apt/sources.list
deb http://ports.ubuntu.com/ubuntu-ports focal main universe

顺手换成“清华源”,让下载速度能够达到几十MB/s。

sed -i s#http://ports.ubuntu.com/ubuntu-ports#https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/# /etc/apt/sources.list

更新 PyPi 和配置镜像源

默认版本的 Pip 版本非常低,我们需要对它进行更新,当更新完毕,可以简单设置软件源,来加速后续软件的下载:

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 文生图应用部署说明。

需要注意的是,如果你想顺利的部署这个项目。务必保持依赖为下面的版本:

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

当我们配置好设备的网络后,就可以来完成这个文生图应用的配置了:

# 访问设备的数据目录
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-tpupip 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 run.sh 
Running on local URL:  http://0.0.0.0:8999To create a public link, set `share=True` in `launch()`.

浏览器访问设备的 IP:8999 ,就能够打开 SD WebUI,开始绘图之旅啦。

随便生成一张 512x512 的图

随便生成一张 512x768 的图

关于 Prompt 的生成和优化,如果你感兴趣,可以阅读去年登上 GitHub 热榜的项目《八十行代码实现开源的 Midjourney、Stable Diffusion “咒语”作图工具》。

最后

原本以为这台设备的折腾时间会非常“短平快”,没想到因为依赖的问题,拉着朋友一起折腾了一两个小时,感谢朋友的时间投入。希望后面开源社区越来越好,社区用户越来越多之后,这些踩坑的事情,能够越来越少。

如果这个设备只是跑个 Demo 就完事,未免太浪费了,接下来我会在一些有趣的场景中,使用这个小东西,来完成一些高性价比的事情。

–EOF


我们有一个小小的折腾群,里面聚集了一些喜欢折腾、彼此坦诚相待的小伙伴。

我们在里面会一起聊聊软硬件、HomeLab、编程上、生活里以及职场中的一些问题,偶尔也在群里不定期的分享一些技术资料。

关于交友的标准,请参考下面的文章:

致新朋友:为生活投票,不断寻找更好的朋友

当然,通过下面这篇文章添加好友时,请备注实名和公司或学校、注明来源和目的,珍惜彼此的时间 😄

关于折腾群入群的那些事


本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)

本文作者: 苏洋

创建时间: 2024年07月29日
统计字数: 14179字
阅读时间: 29分钟阅读
本文链接: https://soulteary.com/2024/07/29/sophgo-edge-ai-device-airbox-bm1684x-stable-diffusion-one-picture-per-second.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/386310.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习008-02-04-09 Assign a Standard Image(分配标准图像)

Assign a Standard Image&#xff08;分配标准图像&#xff09; This lesson explains how to associate an entity class with a standard image from the DevExpress.Images assembly. This image illustrates the entity class in the following sections of the UI: 本课介…

C# 知识点总结

入门 C#程序在.NET上运行&#xff0c;.NET framework包含两个部分&#xff1a; ①&#xff1a;.NET framework类库 ②&#xff1a;公共语言运行库CLR&#xff08;.NET虚拟机&#xff09; CLS&#xff08;公共语言规范&#xff09; CTS&#xff08;通用类型系统&#xff09; .N…

ubuntu20.04安装nginx,mysql8,php7.4详细教程,包成功

目录 1.更新索引 2.安装 Nginx 1.安装 Nginx&#xff1a; 2.启动 Nginx 服务并设置为开机自启&#xff1a; 3.开放防火墙的 80 端口&#xff1a; 4.检查 Nginx 是否正常运行&#xff1a; 3.安装 MySQL 8.0 1.首先&#xff0c;安装 MySQL 的仓库&#xff1a; 安装过程中你会看…

RewardBench:Evaluating Reward Models for Language Modeling

Leaderboard&#xff1a; https://hf.co/spaces/allenai/reward-bench Code&#xff1a; https://github.com/allenai/reward-bench Dataset&#xff1a; https://hf.co/datasets/allenai/reward-bench 在人类偏好的强化学习&#xff08;RLHF&#xff09;过程中&#xff0c;奖励…

【Vulnhub系列】Vulnhub_Seattle_003靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub_Seattle_003靶场渗透 原文转载已经过授权 原文链接&#xff1a;Lusen的小窝 - 学无止尽&#xff0c;不进则退 (lusensec.github.io) 一、环境准备 1、从百度网盘下载对应靶机的.ova镜像 2、在VM中选择【打开】该.ova 3、选择存储路径&#xff0…

【AI大模型】-- 应用部署

一、GPU价格参考 有些在京东就能买到&#xff1a;https://item.jd.com/10065826100148.html美国商务部限制 GPU 对华出口的算力不超过 4800 TOPS 和带宽不超过 600 GB/s&#xff0c;导致最强的 H100 和 A100 禁售。英伟达随后推出针对中国市场的 A800 和 H800。 H100 与 A100&…

CATIA V5R21安装包下载及图文安装教程

大家好&#xff0c;今天给大家分享下catia安装教程 注意安装前请退出杀毒软件&#xff0c;防止误报影响安装进程 下载链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;ypc6 01 在电脑D盘新建文件夹命名为CATIA,将下载的软件压缩包放置在该文件夹。 鼠标右击【C…

淘宝测试环境治理实践

去年之前&#xff0c;阿里巴巴的淘天集团测试环境是以领域方式运作&#xff1a;不局限测试环境治理本身&#xff0c;从测试模式方法论及用好测试环境思路引领集团测试环境治理。领域运作最难的是“统一思想”。业务进一步细分调整后&#xff0c;测试环境治理策略理应由业务方自…

【MetaGPT系列】【MetaGPT完全实践宝典——多智能体实践】

目录 前言一、智能体1-1、Agent概述1-2、Agent与ChatGPT的区别 二、多智能体框架MetaGPT2-1、安装&配置2-2、使用已有的Agent&#xff08;ProductManager&#xff09;2-3、多智能体系统介绍2-4、多智能体案例分析2-4-1、构建智能体团队2-4-2、动作/行为 定义2-4-3、角色/智…

若能重回白宫,特朗普称将把比特币列为美国战略储备资产!

KlipC报道&#xff1a;当地时间7月29日&#xff0c;美国前总统特朗普参加比特币2024大会&#xff0c;并在会上宣布称&#xff0c;如果重返白宫&#xff0c;他将把比特币列为美国战略储备资产。讲话期间&#xff0c;比特币价格一度上涨到6.9万美元大关。 特朗普表示&#xff1a…

Photos框架 - 自定义媒体选择器(UI预览)

引言 在前面的博客中我们已经介绍了使用媒体资源数据的获取&#xff0c;以及自定义的媒体资源选择列表页。在一个功能完整的媒体选择器中&#xff0c;预览自然是必不可少的&#xff0c;本篇博客我们就来实现一个资源的预览功能&#xff0c;并且实现列表和预览的数据联动效果。…

前端基于 axios 实现批量任务调度管理器 demo

一、背景介绍 这是一个基于 axios 实现的批量任务调度管理器的 demo。它使用了axios、promise 等多种技术和原理来实现批量处理多个异步请求&#xff0c;并确保所有请求都能正确处理并报告其状态。 假设有一个场景&#xff1a;有一个任务列表&#xff0c;有单个任务的处理功能…

PyQt ERROR:ModuleNotFoundError: No module named ‘matplotlib‘

Solution:打开cmd输入指令下载malplotlib pip install matplotlib

2024-07-27 Unity Excel —— 使用 EPPlus 插件读取 Excel 文件

文章目录 1 前言2 项目地址3 使用方法3.1 写入 Excel3.2 读取 Excel3.3 读写 csv 文件 4 ExcelSheet 代码 1 前言 ​ 前几日&#xff0c;一直被如何在 Unity 中读取 Excel 的问题给困扰&#xff0c;网上搜索相关教程相对古老&#xff08;4、5 年以前了&#xff09;。之前想用 …

力扣高频SQL 50题(基础版)第二十五题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第二十五题619.只出现一次的最大数字题目说明实现过程准备数据实现方式结果截图 力扣高频SQL 50题&#xff08;基础版&#xff09;第二十五题 619.只出现一次的最大数字 题目说明 MyNumbers 表&#xff1a; ------…

wpf中轮询显示图片

本文的需求是&#xff0c;在一个文件夹中&#xff0c;放一堆图片的集合&#xff0c;然后在wpf程序中&#xff0c;按照定时的方式&#xff0c;循序显示照片。 全部代码 1.声明一个PictureInfo类 namespace WpfApp1 {public class PictureInfo{public string? FileName { get; …

【计算机网络】三次握手、四次挥手

问&#xff1a;三次握手 四次挥手 TCP 连接过程是 3 次握手&#xff0c;终止过程是 4 次挥手 3次握手 第一步&#xff1a;客户端向服务器发送一个带有 SYN&#xff08;同步&#xff09;标志的包&#xff0c;指示客户端要建立连接。 第二步&#xff1a;服务器收到客户端的请求…

Java设计模式—单例模式(Singleton Pattern)

目录 一、定义 二、应用场景 三、具体实现 示例一 示例二 四、懒汉与饿汉 饿汉模式 懒汉模式 五、总结 六、说明 一、定义 二、应用场景 ‌单例模式的应用场景主要包括以下几个方面&#xff1a; ‌日志系统&#xff1a;在应用程序中&#xff0c;通常只需要一个日…

Spring之Spring Bean的生命周期

Spring Bean的生命周期 通过BeanDefinition获取bean的定义信息调用构造函数实例化beanBean的依赖注入处理Aware接口&#xff08;BeanNameAware、BeanFactoryAware、ApplicationContextAware&#xff09;Bean的后置处理器BeanPostProcessor-前置初始化方法&#xff08;Initiali…

关于@JsonSerialize序列化与@JsonDeserialize反序列化注解的使用(密码加密与解密举例)

注&#xff1a;另一种方式参考 关于TableField中TypeHandler属性&#xff0c;自定义的类型处理器的使用&#xff08;密码加密与解密举例&#xff09;http://t.csdnimg.cn/NZy4G 1.简介 1.1 序列化与反序列化 学习注解之前&#xff0c;我们可以先了解一下什么是序列化与反序列…