阅读视图

发现新文章,点击刷新页面。
🔲 ☆

真相调查:Go 语言真的消灭了 Undefined Behavior 吗?

本文永久链接 – https://tonybai.com/2026/03/16/go-language-eliminated-undefined-behavior-truth-investigation

大家好,我是Tony Bai。

在系统编程的古老传说中,流传着一个关于“鼻恶魔”(Nasal Demons)的笑话。

这个梗源自 comp.std.c 新闻组,它是对 C/C++ 语言中“未定义行为”(Undefined Behavior,以下简称 UB)最生动也最恐怖的诠释。根据 ISO C++ 标准,如果你的代码触犯了 UB(例如数组越界、有符号整数溢出、空指针解引用),编译器可以“为所欲为”。

这种“为所欲为”不仅包括程序崩溃,还包括产生错误的结果、损坏数据,甚至——虽然只是笑话——让恶魔从你的鼻孔里飞出来。换句话说,一旦触碰 UB,程序的所有保证瞬间失效。

2009 年,Go 语言横空出世,高举“云原生时代系统语言”的旗帜,承诺提供比 C++ 更高的安全性、更快的编译速度和更简单的并发模型。Go 的拥趸们津津乐道于它的内存安全特性,仿佛 Go 已经彻底终结了 UB 的噩梦。

但真相果真如此吗?

近日,我翻阅了一份珍贵的历史资料——2013 年发生在 golang-nuts 邮件组的一场深度辩论。对话的一方是 Go 语言曾经的顶级贡献者 Dave Cheney,另一方是 Go 核心团队成员、gccgo 的作者 Ian Lance Taylor。

这场发生在这个语言童年时期的对话,揭示了一个令人背脊发凉又引人深思的事实:Go 并没有完全消灭未定义行为,它只是将 UB 赶进了一个更隐秘、更危险的角落——并发。

本文将带你层层剥开 Go 语言规范的表皮,调查“未定义行为”在 Go 中的真实生存状态,并探讨这对我们编写高质量代码意味着什么。

用“定义”换取“安全”——Go 的显式哲学

要理解 Go 做了什么,我们首先得明白 C/C++ 为什么保留 UB。Ian Lance Taylor 指出,C/C++ 保留 UB 本质上是为了性能——允许编译器假设“坏事永远不会发生”,从而进行激进的优化。

Dave Cheney 的疑问直击灵魂:“Go 规范中几乎看不到‘undefined’这个词,这种设计如何影响了 Go 的安全性与性能?”

答案是:Go 选择了一条确定性(Determinism)优先的道路。Go 语言规范以一种近乎偏执的态度,将绝大多数在 C/C++ 中属于 UB 的行为,都进行了严格的“定义”。即便是在错误场景下,Go 也要保证行为是可预测的

整数溢出的“确定性”承诺

在 C 语言中,有符号整数(Signed Integer)的溢出是经典的 UB。编译器有权假设溢出永远不会发生,从而将 x + 1 > x 优化为恒真(Always True),这曾导致过无数的安全漏洞。

但在 Go 语言规范中,对此有着截然不同的定义:

无符号整数:运算结果严格按照 2^n 取模。这意味着高位被丢弃,程序可以依赖这种“回绕(Wrap-around)”行为。

有符号整数:运算可以合法地溢出(legally overflow)。结果由有符号整数的表示方式(通常是补码)、运算类型和操作数确定性地定义。溢出不会导致运行时 Panic。

最关键的是,Go 规范明确禁止编译器进行危险的假设:“编译器不得假设溢出不会发生。例如,它不得假设 x < x + 1 总是为真。”

代码实证:

// https://go.dev/play/p/5CZVVU-SITX
package main

import "fmt"

func main() {
    // 1. 有符号整数溢出 (Signed Overflow)
    var a int8 = 127
    // 在 C 语言中这是 UB,但在 Go 中这是明确定义的
    b := a + 1
    fmt.Printf("int8: %d + 1 = %d\n", a, b)
    // 输出: 127 + 1 = -128 (确定性的回绕)

    // 2. 编译器禁止做的优化
    // 如果编译器假设溢出不发生,它会把这个判断优化掉
    if b < a {
        fmt.Println("发生溢出:b 确实小于 a")
    } else {
        fmt.Println("未发生溢出逻辑(Go 中不会走到这里)")
    }

    // 3. 无符号整数溢出 (Unsigned Overflow)
    var c uint8 = 255
    d := c + 1
    fmt.Printf("uint8: %d + 1 = %d\n", c, d)
    // 输出: 255 + 1 = 0 (严格的 Modulo 2^n)
}

Go这么做的代价是Go 编译器失去了一些数学优化机会(例如不能简单地消除某些循环边界检查)。但也消除了因编译器“自作聪明”而导致的逻辑崩塌,保证了不同平台下的行为一致性。

数组越界的“必杀令”

缓冲区溢出(Buffer Overflow)是网络安全史上最大的杀手。C/C++ 将越界访问视为 UB,允许攻击者通过越界读取敏感内存或覆盖返回地址,进而控制系统。

Go 对此零容忍:越界必须触发 Panic。

无论是在栈上分配的数组,还是在堆上分配的切片,Go 编译器都会在每一次访问操作前(除非能静态证明安全)插入一段 Bounds Check(边界检查)指令。一旦越界,程序立即停止,绝不含糊。

代码实证:

// https://go.dev/play/p/-CqDpIDr0BC
package main

import "fmt"

func main() {
    // 定义一个长度为 3 的切片
    s := []int{1, 2, 3}

    // 模拟一个动态索引(避免编译器在编译期直接报错)
    index := getIndex() 

    fmt.Println("尝试访问索引:", index)

    // 这里会触发 Runtime Panic
    // 错误信息明确:runtime error: index out of range [3] with length 3
    val := s[index] 

    fmt.Println("这行代码永远不会执行", val)
}

func getIndex() int {
    return 3
}

这种边界检查是在运行时(Runtime)介入,抛出 Panic,打印堆栈信息。因此会带来运行时性能损耗。虽然现代 Go 编译器引入了 BCA(边界检查消除)技术,但在无法静态分析的场景下,这就是必须缴纳的“安全税”。

空指针的“硬着陆”

在 C 语言中,解引用一个空指针是 UB。编译器有时会优化掉判空逻辑,因为它认为“既然你解引用了,那指针肯定不为空”,导致后续的安全检查失效。

Go 规定:解引用 nil 指针必须触发 Panic。

这通常是通过 CPU 的硬件异常(SIGSEGV)来捕获的。Go 运行时会接管这个硬件信号,并将其转化为一个可恢复的 Go Panic,而不是让进程直接 Core Dump 或进入不可预测的僵死状态。

代码实证:

// https://go.dev/play/p/hlyZks1dGRf
package main

import "fmt"

type User struct {
    Name string
}

func main() {
    var u *User // u 默认为 nil

    fmt.Println("准备访问 nil 指针...")

    // 在 C 中这是 UB,可能导致程序崩溃或更糟的情况
    // 在 Go 中,这不仅会 Panic,还可以被 Recover 捕获
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("捕获到恐慌:", r)
            // 输出: runtime error: invalid memory address or nil pointer dereference
        }
    }()

    // 触发 Panic
    fmt.Println(u.Name)
}

综上,我们可知:在单线程维度,Go 确实几乎消灭了 Undefined Behavior。它通过强制规定行为(Wrapping, Panicking),将“未定义”变成了“定义明确的错误”。即使程序写错了,它的错误方式也是确定的,而非随机的。

房间里的大象——数据竞争

如果文章到这里结束,那么 Go 就是一个完美的、绝对安全的语言。

但 Ian Lance Taylor 随后抛出了一个重磅炸弹:

“However, Go does have undefined behavior: if your program has a race condition, the behaviour is undefined.”
(然而,Go 确实存在未定义行为:如果你的程序存在数据竞争,那么行为就是未定义的。)

这就是 Go 语言安全神话中最大的裂痕。

在 Rust 中,编译器借用检查器(Borrow Checker)会在编译期阻止数据竞争,因此 Rust 可以自豪地宣称“无数据竞争”。但 Go 选择了更简单的并发模型,允许 Goroutine 共享内存。

一旦发生数据竞争(Data Race),即多个 Goroutine 同时访问同一块内存且至少有一个是写操作,Go 就不再提供任何保证。

为什么数据竞争是真正的 UB?

很多 Gopher 认为数据竞争只是“读到了旧数据”或者“计数器少加了 1”。这是一种极其危险的误解。在多核 CPU 和现代编译器优化的加持下,数据竞争在 Go 中可能导致内存安全破坏

这主要源于 Go 的多字数据结构(Multi-word Data Structures)

接口(Interface)的“撕裂”

Go 的 interface 在底层是由两个机器字组成的:{type_ptr, data_ptr}。

  • type_ptr 指向具体类型的元数据(如方法表)。
  • data_ptr 指向具体的数据值。

假设我们有一个全局接口变量 var i interface{},以及两个实现类型 type A 和 type B。

  • Goroutine 1 试图将 i 赋值为 A{}。
  • Goroutine 2 试图将 i 赋值为 B{}。

如果没有加锁,Goroutine 3 可能会读到一个“弗兰肯斯坦”般的怪物接口:它的 type_ptr 来自 A,但 data_ptr 却指向 B 的数据!

当你调用这个接口的方法时,程序会尝试用 A 的方法表去操作 B 的内存布局。这会导致什么?

如果运气好,你会得到Panic(类型断言失败或非法内存访问)。

反之,如果运气不好,那远程代码执行(RCE)的攻击者可以精心构造内存布局,利用这种类型混淆(Type Confusion)来劫持控制流。

切片(Slice)的“越界”

切片由 {ptr, len, cap} 三个字组成。数据竞争可能导致你读到了新的 len(变得很大),但 ptr 还是旧的(指向一个小数组)。结果是你拥有了一个长度远超底层数组容量的切片,这让你能够读取甚至修改不属于该切片的任意内存——这正是 C 语言缓冲区溢出的翻版。

这,就是 Go 中的 Undefined Behavior。 它不是“鼻恶魔”,但它是真实存在的安全黑洞。

那些“未指明”的灰色地带

除了致命的 UB,讨论中还涉及了 Go 语言规范中的另一种存在:未指明行为(Unspecified Behavior)实现定义行为(Implementation-Defined Behavior)

这些行为虽然不会导致内存破坏,但同样破坏了程序的“确定性”。

Map 的迭代顺序

在 Go 中,for k, v := range m 的顺序是故意未定义的。

Ian 解释说,这是为了防止开发者依赖某种特定的哈希实现顺序。Go 运行时甚至在每次迭代开始时引入了随机种子(迭代器会在map bucket 数组中随机选取一个起始位置向后遍历),强制让顺序变得不可预测。

这是一个非常有智慧的设计:通过强制随机化,逼迫开发者编写不依赖顺序的健壮代码。

表达式求值顺序:在“确定”与“未指明”之间

在 C/C++ 中,f(g(), h()) 中 g() 和 h() 谁先执行是未定义的(Undefined Behavior 或 Unspecified Behavior),这取决于编译器实现。

Go 语言规范对此做了更严格的规定,但依然保留了一块微妙的“灰色地带”。

确定的部分(Defined):

Go 规定,在求值表达式的操作数、赋值语句或返回语句时,所有的函数调用、方法调用和通信操作(Channel receive)都必须按照词法上从左到右的顺序执行。

例如,在赋值语句 y[f()], ok = g(h(), i()+x[j()], <-c), k() 中,函数调用和通信的发生顺序被严格锁定为:

f() -> h() -> i() -> j() -> <-c -> g() -> k()。

未指明的部分(Unspecified):

然而,规范同时也指出:并没有规定上述事件与表达式求值、索引操作、以及变量 y 的求值之间的顺序。

这意味着,虽然函数调用的相对顺序是固定的,但涉及副作用(Side Effects)的变量读写顺序可能是不确定的。来看 Spec 中的经典反例:

a := 1
f := func() int { a++; return a }

// x 可能是 [1, 2] 也可能是 [2, 2]
// 因为 a 的求值与 f() 的执行顺序未定义
x := []int{a, f()}
println(a, x)

// --- 示例:map 字面量中 key/value 的求值顺序未定义 ---
b := 1
g := func() int { b++; return b } // g() 会修改 b

// 若 b 先被求值:key=1, value=2  → m = {1: 2}
// 若 g() 先被执行:key=2, value=2 → m = {2: 2}
// Go 规范不保证 key 表达式与 value 表达式谁先求值
m2 := map[int]int{b: g()}
println(b, m2[b])

虽然 Go 比 C/C++ 确定得多,但在编写依赖于求值顺序的副作用代码(例如在参数列表中修改全局变量)时,依然可能会掉进“未指明行为”的陷阱。因此,最好不要在单行表达式中依赖复杂的副作用顺序。

浮点数转换的幽灵

讨论中有开发者 提到了 float64 转换为 uint8 的行为。在早期的 Go 版本中,对于溢出值的处理可能依赖于底层硬件指令(x86 vs ARM),从而表现出不一致。

虽然 Go 正在逐步收紧这些规范,例如 #76264 提案(尚未落地)正试图统一浮点转整数的饱和行为,但这提醒我们:即使是强类型语言,在跨平台移植时也可能遇到底层架构带来的“方言”差异。

如何在充满 UB 的世界里生存?

既然 Go 没有彻底消灭 UB,作为开发者,我们该如何自保?

视 -race 为生命线

Ian Lance Taylor 的警告应该被打印在每个 Go 开发者的工位上。

建议

  • 单元测试必须开启 -race 标志运行。
  • 在 CI/CD 流水线中,竞态检测是不可跳过的阻断性步骤。
  • 不要相信“我的并发逻辑很简单,不会出错”,人脑无法模拟现代 CPU 的乱序执行。

敬畏 unsafe

Go 的 unsafe 包是通往 C 语言 UB 世界的后门。使用 unsafe.Pointer 进行类型转换时,你实际上是在对编译器说:“我知道我在做什么,出了事我负责。”

除非你是编写底层运行时或极致性能库的专家,否则在业务代码中绝对禁止使用 unsafe。一旦使用,你必须熟读《Go 内存模型》和《垃圾回收器写屏障规则》。

理解“实现定义”与“未定义”的区别

  • 未定义(UB):可能导致 Crash、数据损坏、安全漏洞(如数据竞争)。零容忍。
  • 未指明/实现定义:不同版本或平台可能表现不同(如 Map 顺序)。不要依赖它。
  • 已定义:Go 承诺的行为(如整数回绕)。可以依赖,但需知晓代价。

小结:完美的幻象与工程的现实

通过这次“真相调查”,我们得出的结论可能有些令人沮丧,但也足够清醒:

Go 语言并没有彻底消灭 Undefined Behavior。它只是通过牺牲一部分性能和增加运行时检查,将 UB 的“攻击范围”从 C/C++ 的“随处可见”缩小到了“并发数据竞争”和“不安全代码”这两个特定的领域。

这是一种极其成功的工程权衡。它让 Go 在保持高性能的同时,为 99% 的日常编码提供了坚实的安全保障。

然而,作为 Gopher,我们不能沉浸在“绝对安全”的幻象中。我们必须意识到,当我们敲下 go func() 的那一刻,当我们试图共享一个指针的那一刻,我们正行走在悬崖的边缘。

Go 给了我们围栏(定义明确的行为),但也给了我们梯子(并发与 Unsafe)。能否不跌入 UB 的深渊,最终取决于我们是否遵守工程的纪律。

资料链接:https://groups.google.com/g/golang-nuts/c/MB1QmhDd_Rk


你遇到过“鼻恶魔”吗?

哪怕是 Go 这样严谨的语言,在并发面前也会露出锋利的牙齿。在你的开发生涯中,是否遇到过那种因为没开 -race 而在生产环境产生的“灵异事件”?你对 Go 这种“用性能换确定性”的哲学怎么看?

欢迎在评论区分享你的“探案”心得!


还在为“复制粘贴喂AI”而烦恼?我的新专栏 AI原生开发工作流实战 将带你:

  • 告别低效,重塑开发范式
  • 驾驭AI Agent(Claude Code),实现工作流自动化
  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

扫描下方二维码,开启你的AI原生开发之旅。


你的Go技能,是否也卡在了“熟练”到“精通”的瓶颈期?

  • 想写出更地道、更健壮的Go代码,却总在细节上踩坑?
  • 渴望提升软件设计能力,驾驭复杂Go项目却缺乏章法?
  • 想打造生产级的Go服务,却在工程化实践中屡屡受挫?

继《Go语言第一课》后,我的《Go语言进阶课》终于在极客时间与大家见面了!

我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为这样的你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力,更有实战项目串讲。

目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变! 现在就加入,让你的Go技能再上一个新台阶!


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

© 2026, bigwhite. 版权所有.

🔲 ☆

动手玩AI系列之一:免费使用谷歌的云上机器画小姐姐,有手机就能用

00.png

今晚动手学习了用谷歌 Colab 生成 AI 小姐姐,记录一下过程。

前置条件:科学上网

Step 1:连接 Colab

  • 打开谷歌的网址:https://colab.research.google.com/
  • 连接机器
  • 选择 GPU

01.png

Step 2:安装依赖

  • 开启新的 Jupyter Notebook 窗口
  • 创建 Code 单元,输入以下安装命令,点击左上角运行 ```shell !git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui !git clone https://github.com/yfszzx/stable-diffusion-webui-images-browser /content/stable-diffusion-webui/extensions/stable-diffusion-webui-images-browser !curl -Lo chilloutmixni.safetensors https://huggingface.co/nolanaatama/chomni/resolve/main/chomni.safetensors !curl -Lo ulzzang-6500.pt https://huggingface.co/nolanaatama/chomni/resolve/main/ulzzang-6500.pt !curl -Lo koreanDollLikeness_v10.safetensors https://huggingface.co/duthanhduoc/chilloutmix-set/resolve/main/koreanDollLikeness_v10.safetensors !mkdir /content/stable-diffusion-webui/models/Lora !mv “/content/koreanDollLikeness_v10.safetensors” “/content/stable-diffusion-webui/models/Lora” !mv “/content/chilloutmixni.safetensors” “/content/stable-diffusion-webui/models/Stable-diffusion” !mv “/content/ulzzang-6500.pt” “/content/stable-diffusion-webui/embeddings” %cd /content/stable-diffusion-webui !git checkout 91c8d0d !pip install –upgrade pip !COMMANDLINE_ARGS=”–share –disable-safe-unpickle –no-half-vae –xformers –reinstall-xformers –enable-insecure-extension-access” REQS_FILE=”requirements.txt” python launch.py
- 安装完成后,会出现一个网址,格式是 xxx.gradio.live,点击后进入 Stable Diffusion 的 Web UI,如下图所示

![stable_diffusion_01.png](/images/2023/2023-03-13-stable_diffusion_generate_ai_beauty/stable_diffusion_01.png)

![02.png](/images/2023/2023-03-13-stable_diffusion_generate_ai_beauty/02.png)

## Step 3:生成 AI 小姐姐
- 在左上方的两个文本框里输入正面和负面提示词
prompts(正面提示词):生成的小姐姐的描述,比如:小姐姐,你好漂亮,我喜欢你

<lora:koreanDollLikeness_v10:0.35>,best quality ,masterpiece, illustration, an extremely delicate and beautiful, extremely detailed ,CG ,unity ,8k wallpaper, Amazing, finely detail, masterpiece,best quality,official art,extremely detailed CG unity 8k wallpaper,absurdres, incredibly absurdres, huge filesize , ultra-detailed, highres, extremely detailed,beautiful detailed girl, extremely detailed eyes and face, beautiful detailed eyes,light on face,(Hanfu:1.1),1girl

Negative prompts(负面提示词):生成的小姐姐不希望出现的描述,比如:小姐姐,你好丑,我不喜欢你

sketches, (worst quality:2), (low quality:2), (normal quality:2), lowres, normal quality, ((monochrome)), ((grayscale)), skin spots, acnes, skin blemishes, bad anatomy,(long hair:1.4),DeepNegative,(fat:1.2),facing away, looking away,tilted head, {Multiple people}, lowres,bad anatomy,bad hands, text, error, missing fingers,extra digit, fewer digits, cropped, worstquality, low quality, normal quality,jpegartifacts,signature, watermark, username,blurry,bad feet,cropped,poorly drawn hands,poorly drawn face,mutation,deformed,worst quality,low quality,normal quality,jpeg artifacts,signature,watermark,extra fingers,fewer digits,extra limbs,extra arms,extra legs,malformed limbs,fused fingers,too many fingers,long neck,cross-eyed,mutated hands,polar lowres,bad body,bad proportions,gross proportions,text,error,missing fingers,missing arms,missing legs,extra digit, extra arms, extra leg, extra foot, ```

  • 下方 Sampling method 选择 DPM++ SDE Karras
  • Width 选择 512,Height 选择 768,CFG Scale 7
  • 右边 Batch count 1,Batch size 1
  • 点击 Generate,不到一分钟,就可以看到生成的小姐姐了

生成效果示例

🔲 ☆

Qwen VLo 效果实测

2025年6月26日,Qwen团队发布了Qwen VLo,一个定位是“unified multimodal understanding and generation model”的模型,包括多模态的理解和生成。

根据官方的介绍博客,Qwen VLo包含下面的功能:

  • 图像生成:文生图、2D卡通图像转真实图像
  • 图像编辑:例如修改某个主体、更换颜色、更换风格
  • 图像算法能力:例如检测框、canny 算子、图像分割结果

经过一段时间的测试,我个人的总结是:

  1. 生图能力:效果比较差,感觉是一两年前生图模型的水平
  2. 图像风格转换:效果比较稳定,生图有美感
  3. 图像编辑能力:还算可以,有一些case做不好
  4. 检测框:能稳定生成,单人没问题,多人场景下也不算很准
  5. 图像分割:没有成功
  6. canny算子:细节更丰富,但有一些地方与原图并非完全对齐

再单独吐槽一个点,刚开始没找到Qwen VLo的入口,看微信公众号文章的留言才发现,并不是以一个模型列在可选模型列表中的,而是不管选择什么模型,只要做生图任务或者上传图片进行对话,都调用Qwen VLo。这种不遵从用户已有习惯的设置,随意而为的做法,用户体验很差,要是没看到留言回复,真的不知道怎么用。

下面详细展开我上面总结中各个条目的实际结果。

1. 生图

用最简单的提示词来生成图,下面是一些结果和对应的提示词。

Prompt: 画一个哪吒

Prompt: 画一个哪吒

Prompt: 画一个哪吒骑在龙上的照片

Prompt: 画一个哪吒骑在龙上的照片

没有处理好”骑”这个动作。

Prompt: 生成一个大象和巨龙战斗的图片

Prompt: 生成一个大象和巨龙战斗的图片

大象长翅膀了??

Prompt: 画一幅李白和杜甫打篮球的图片

Prompt: 画一幅李白和杜甫打篮球的图片

非常奇葩的效果:自动将上一轮的图像用上了,虽然提示词根本没有提上一轮的内容。

新开一轮,同样的提示词,结果如下:

Prompt: 画一幅李白和杜甫打篮球的图片

似乎看到了两三年前生图模型的效果…

看看同样提示词,豆包的生成结果:

豆包网页版效果,Prompt: 画一幅李白和杜甫打篮球的图片

数数也数不对:

Prompt: 画一幅包含四个苹果的静物图

总结:感觉Qwen VLo的画图还是玩具级别,距离真实场景下的使用,还差比较远。

2. 风格转换

尝试了三组图像风格转换,包括吉卜力风格、3D风格、像素风格。

输入图像

Prompt: 将图片变成吉卜力风格

Prompt: 将上面的图片转换成3D风格

输入图像

Prompt: 转换成吉卜力风格

提示词:转换为3D风格

输入图像

Prompt: 转换为真人照片

Prompt: 转换为吉卜力风格

Prompt: 转换为3D风格

Prompt: Prompt: 转换为像素风风格

结论:吉卜力风格,3D风格和像素风格生成的图片还是挺不错的,草稿转真人恐怖谷拉满。

3. 图像编辑

基于这张著名的合影做了一些有意思的图像编辑功能:

输入图像

图像上色:

Prompt: 给图片上色

上色对照片的内容改变太多,而且衣服一部分蓝色,一部分黑色,也有点奇怪。

给这些物理学大佬一人戴一个博士帽如何?

Prompt: 给所有人加一顶博士帽

结果一般般,有一些加了博士帽,效果还可以,有一些没有加上去,图像的内容还是变了,爱因斯坦都不像了。

每个人戴一个诺贝尔奖牌:

Prompt: 给每个人的脖子上挂一个诺贝尔奖牌

这个奖牌效果还可以,除了有一个大佬头变大了很多,有点鬼畜,但三排变成了两排,而且画面变化太大了,人物都没一个认识的了……

露齿微笑:

Prompt: 让画面中的每个人都露齿微笑

这个效果还行.

头变成流汗的emoji:

Prompt: 把每个人的头都变成流汗的emoji

怎么都变成了外星人,还有一个拿着头。。

变动物怎么样?

Prompt: 把每个人的头都变成一种动物

左上角的🦁亮眼,别的都是什么呀…

结论:图像编辑整体差强人意,一些需求会出现鬼畜效果。对于这种真人照片,致命问题是图像变化太影响ID的稳定性了,可能对于卡通图中的形象,画面变一点还能接受,真人图的细节变化,可能就完全像是换了一个人。

4. 检测框

Prompt: 将图片中的人用bbox框起来

有时候Prompt会失效:

5. 分割图

分割功能我还没成功实现过,尝试了几次,要么出来文本回答,要么直接返回一张原图

6. Canny效果图

上面的小狗图片得到的Canny结果如下:

Prompt: 给出图片的canny算子结果图

用OpenCV计算得到的结果如下:

可以看到,并不是完全一样,AI生成的Canny细节更丰富,但一些地方并不是与原图完全对齐(例如鼻子),不知道对结果有多大影响?

7. 其他问题

多次对话后,指令遵循能力下降:

新开一次会话就可以了:

8. 总结

总体来说,比较有意思的是风格转换和图像编辑功能,生图功能不知道为什么做的这么差,检测框和Canny还行,分割图没试出来。

这个模型的发布,说明Qwen团队也尝试对偏向应用的生图、编辑图功能进行探索,但相比豆包等长期积累,有大量用户体验上优化、长期生图效果迭代的选手,目前这个模型还不能让人满意。

🔲 ☆

一种基于 EasyVtuber 和 Stable Diffusion 的零成本虚拟形象直播方案

我一直很想整个 Live2D 模型拿来直播,奈何囊中羞涩,因此只得另辟蹊径。网上搜寻了类似 PNGTuber 之类的方案后,依然觉得不够满意。结果前些天和朋友聊起此事,被推荐了 EasyVtuber,经过一番倒腾后,完美满足了我的需求,本文则作为教程介绍如何使用 EasyVtuber 配合 Stable Diffusion 零成本创建自己的虚拟形象进行直播。 当然要注意的是,此方案对计算机性能要求不低(因为需要 AI 模型实时计算绘图),拿来做游戏直播之类的可能需要你有一张强劲的显卡。 首先,需要部署 Stable Diffusion 以帮助我们生成我们自己的 OC 形象。如果你使用外部平台生成 OC 形象,则可以直接跳到下一节。 为此,请前往 lllyasviel/stable-diffusion-webui-forge,然后在 README 的 一节中点击…

来源

🔲 ⭐

英伟达黄仁勋CES霸气登场!鳄鱼皮夹克发售5090显卡,钱包快捂住还是准备剁手?

黄教主已经在CES上吹响了号角,准备好钱包了没有?大家好,欢迎收听老范讲故事的YouTube频道。今天咱们来讲一讲CES上,全村最靓的仔黄仁勋。黄教主都发布了一些什么东西?我们是不是要准备好钱包去买东西了,还是说咱们稍微冷静一下?

现在AI嘛,市值最高的公司英伟达,作为英伟达的老板,黄仁勋在整个的CES大会上一定是最靓的仔。其他做AI的人,可能还没有他这么风光亮丽。为什么呢?因为CES呢叫做消费电子展,那些做云计算的人,你们靠后站。黄教主是要来发布游戏显卡的,他是来玩消费的,这个还是有很大差别的。而且整个的AIGC玩了两年多,唯一挣着钱的就只有黄教主自己了,其他人都在这赔本赚吆喝呢。所以呢,人家一定要风光亮丽的跟大家做一个演讲。

咱们先看一下皮衣教主,因为他走到哪穿个皮衣嘛。他这个皮衣呢,这一次是一件新皮衣,不是以前穿过的这些旧皮衣。这个叫Tom Ford设计的一个皮衣,这个皮衣呢叫鳄鱼皮印花皮夹克。就是我们可以看到这个皮夹克上有很多非常大的花纹,这个东西呢叫鳄鱼皮印花。就是你如果买了什么鳄鱼皮钱包或者是鳄鱼皮的皮鞋,上面就是这种大花。我还真没见过鳄鱼皮夹克,他这个皮夹克呢应该不是鳄鱼皮的,应该是牛皮的,只是呢把这个大花纹给你印上了而已。

但是这个夹克也不便宜了,8,990美金一件夹克。但是这个对于现在全世界市值最高的公司的创始人和CEO来说,不穿这样的夹克,估计也真的压不住场子了。首先上来讲的第一个,肯定还是数据中心业务。虽然这是消费电子展,但是数据中心业务才是英伟达现在真正的核心价值。那么消费电子展呢,游戏显卡是跑不掉的,5090这个一定要上来好好跟大家show一下50系显卡。

然后呢,是整了一个非常奇怪的新品,叫project DigITs。这个东西长得像Mac mini那么大的一个超强算力的AI主机,因为看Mac mini卖的很好嘛。

所以,要出来跟大家show一下。后边呢,还做了一些软件部分的发布,这一部分基本上可以忽略不计。至于其他机器人的部分呢,2025年我们看到成品满街跑的,这个可能性也不大,所以我们就后边省略掉了。

首先,黄教主上来以后,先举着一个大盾牌,把一堆的芯片拼成盾牌那么大,就像美队一样,举着个盾牌就上来了。这个东西是什么呢?叫Grace Blackwell NV link 72。当然了,GBNV link 72呢,长得并不是真的这个样子,他只是说跟大家表演一下这个东西,把芯片铺开了应该是这样。

英伟达的显卡一般叫B开头的呢,就是它的GPU,就是Blackwell框架,黑井框架。说B200、B多少,这就是GPU;G开头的呢,实际上是CPU,叫Grace。这个东西呢,是ARM的CPU。所以呢,这个叫GBNV link 72呢,就是36个Grace CPU,加上72个Blackwell的GPU拼在一起,加上这种高速连接,整个拼一块儿以后,做的一个高性能运算的主机。大家可以在这个上面去训练模型。

它呢,现在只是把这些东西都拼成了一个盾牌的样子,给大家看一眼。如果真的是一个这个GB 72这种东西的话,它是举不上来的,那个机器拼在一起是1.5吨。但是消费电子展呢,给大家看这个意思不大,看过了就知道了。

现在数据中心是谁是老大?今天的真正重头戏5090、5090D、5080、5070,也就是50系显卡。前面的40系显卡、30系显卡,我电脑上是一个3060,我儿子电脑上是4070。什么时候会去长这个数呢?就是他的显卡的架构换了。40系的是A系的显卡,叫ADA的这个芯片;到50系呢,就是B系列的,就是Blackwell黑井系列的这个显卡。

它按照黑井系列整个架构重新设计的,所以呢,5090、5090D、5080、5070这些显卡,大家可以认为,跟我们现在去买的什么GB200或者B200这样的GPU吧,是一样的这个架构。

5090跟5090D的差异呢,就是5090的就是为中国生产的阉割版本。就跟原来美国制裁中国,说你们不可以去用4090了,中国就开始卖叫4090D。D呢,现在有两种说法,一种呢说是叫精简的,还有一种说法呢是Dragon,就是专门为龙设计的这个芯片。就是它里面的CUDA的核心数量、连接的这个速度,以及里面的这个内存的大小和连接速度,都是受到限制的一个设备。

当然,即使受到限制了呢,它也要比这个传统的4090还是要快的。这就是5090和5090D。然后5080和5070呢,要比5090 GPU的扩大的核心要更少一些,而且呢价格也相对来说比较便宜。现在呢,很多人就觉得天塌了,为什么?因为显卡这个东西呢,其实一直是作为一种金融产品,或者叫理财产品来去处理的,它有很强的金融属性。而这一次呢,黄教主干了一个事情,就是降价。他的5090呢,其实降的并不多,应该比4090还要贵一些的,但是呢,他号称说5070价格还是非常便宜的。对于原来那些囤4090的人来说,这个天就塌下来了。

整个的性能来说的话,我觉得我们就没有必要去跟大家讲说,它到底有多少CUDA核心,怎么算呢,这个其实没什么意义。它里边做了一个新的东西,叫大力水手4DLSS 4,可以在显卡内部进行更多的这种直插帧的运算。游戏原来输出的比较低的帧率、比较低的这个分辨率的这个图片,它可以通过插帧、插分辨率的这些功能,让我们看到一个非常非常高帧率、非常清晰的一个画面,是他们真的这个新功能。而大力水手4必须在50系显卡上才可以走,而这个40系显卡最高可以看到大力水手3.5。如果想使用大力水手4,你就要老老实实的去买50系的显卡。

也是很多人在去批判,说黄教主你这个刀法实在是很精准,也是如此了。有多少人需要去买5090呢?其实原来买4090的这些人,在挖币已经过时之后,他们到底能不能把这个4090的钱挣回来,其实是很难说的。

虽然他有金融属性,但是原来主要是拿他挖币。以太坊已经不用4090去挖币了,人家换了新的这种凭证方式了。那么4090可能也就是说,第一个打游戏用,第二个呢,拿它去做一些本地的渲染,或者是本地的大模型,比如说Stable Diffusion。我在本地跑一跑,也就干一些这样的事情。

那么现在上5090到底有没有这个需求呢?其实这一块的需求和动力是不足的。为什么呢?就是你在本地去用这样的一个设备,你真的需要那么大的分辨率、那么高的刷新率,然后有那么好的游戏吗?其实没有。游戏跟显卡之间呢,都是矛跟盾的两面,要来回翻来翻去的。首先是游戏更新了,然后说OK,我们现在需要更好的显卡,否则的话这个游戏跑不到最高帧率。

现在这几年呢,其实游戏并没有这样的东西出来。可能大家可以去期待一下GTA6,当然GTA他们一般优化做得还可以,所以呢,未必需要这么高规格的显卡才能带得动他。可能3060、3070都可以跑得起来,因为做游戏的人他也想清楚说,如果我做一款游戏只有5090才能玩的话,那我这游戏能卖几套?而且呢,游戏如果帧率太高的话,其实人眼已经看不到了,所以这个帧率是有极限的。而这个分辨率呢,其实你到4K也算是到极限了,你再往上其实已经做不上去了。

所以现在呢,其实在游戏这一块上说,需求动力不是那么足。至于说从大模型或者这一块来说呢,更多的人还是愿意去使用像A100、H100这样的专门的算力卡,而不是说来去使用这种游戏显卡。因为游戏显卡其实它的设计侧重还是不一样的,你拿这种东西去做大模型的话,并不那么划算。

50系列呢,到1月30号,5090的这个显卡就可以在外面买到了,可能要到3月份5080、5070的这些显卡会逐步的面世。再往后一段时间呢,会出笔记本用的50系显卡。现在呢,像什么ROG,这个叫败家之眼,他们已经在开始官宣他们搭配50系列显卡的这些笔记本了。

我估计在买到差不多得到年中了吧。5月份才能买到,而且以英伟达这个显卡升级的速度的话,我觉得可能过一两年再去买这个东西,也还是来得及的。一般是说显卡提升了以后,这帮做游戏的再想一想,说:“哎,我是不是可以再去做一些更复杂的游戏出来?”慢慢地去淘汰这个低端显卡,一般是这样的一个情况。这是今年的重头戏。

5090再往后呢,就发布了一个很奇怪的东西,叫project DigITs。这个东西呢叫做数字项目或者数据工程。我估计黄教主呢也是看旁边苹果整的Mac mini M4出尽了风头,这么小的主机,这么强的算力。很多人把它买回来去做大模型,甚至把几台M4 mini的这个主机拼在一起,还可以跑一些更大的模型出来。黄教主说:“这个我也行的。”这种设备呢,从结构设计上,甭管是谁设计的,但是从生产上来说呢,一定是台湾或者是大陆的这些果链企业去生产的。所以黄教主说:“你们谁去给我整个这玩意出来?”这个应该并没有什么难度。

黄教主这个时髦肯定还要改一下。那么它这个里边使用的芯片是什么呢?叫GB10。G就是CPU,它里头是有ARM CPU的;B呢是Blackwell的这个算力芯片,也都在里面。但是呢,GB10是没法去打游戏的,它没有这个图像渲染的能力,或者说它图像渲染的性能并没有那么好。大家主要还是要用它去做数据分析,去做大模型的训练和推理。

这个机器有128G的统一内存,这个还是很贵的一个东西。因为像我们在苹果上买统一内存,那玩意简直像金子做的一样,非常非常昂贵。你说我升硬盘,这个价格还可以接受,但是你要想给苹果的Mac mini或者是MacBook这种容易升内存,那真的是肉都疼。它这个里边128G的统一内存,4T的存储,这块不太值钱。然后里边的操作系统呢,是英伟达自己定制的一个操作系统,在乌班图的基础上去改的一个Linux操作系统。据说呢是可以跑200B的模型,这个已经是非常非常吓人了。

像我现在的MacBook只能跑三十几B的,72B的已经跑不起来。他这可以跑200B的模型,如果把两台连接在一起,就直接可以跑405B。因为现在我们有一个405B的模型,就是Llama3 405B,你们两个串一块就可以跑了。这个还是很吓人的。

当然,价格呢,肯定也得对得起它这些高端配置,3,000美金可真的是一点都不便宜。Mac mini应该是500美金还是600美金开始吧,最高的这个款式大概可能到不了2,000美金。他这个直接上来就3,000美金,这个大家自己看着办。

但是呢,发布会上有一些东西是没说的。什么东西没说呢?就是这个设备的功率和散热到底怎么样,他没说。英伟达向来不是以省电著称的,英伟达一直都是非常非常耗电的。像我们前面讲的5090什么这种东西,经常是可能五六百瓦。但是他这样的一个GB10的芯片,塞了这么点的一个机器里头,到底是有多少功率?到底是需要配多大的风扇?这个东西能有多吵,大家可能心里要有一个准备。

当然了,你想3,000美金我都花了,如果想动小了的话,可能很多人会觉得我这个钱没有花到地方。我花了钱以后,第一个重量要够。这个英伟达的老黄还是非常非常有经验的。你们去看那个4090也好,5090也好,那个显卡那么老大个,你把这个显卡拿起来,也是贼沉贼沉的。为什么?因为都是巨大的散热铜管以及风扇,还有很多的金属散热片。所以那个东西非常非常的重。

现在它发布了这样的小型主机,这个到底有多重?到底有多么吵闹?大家自己去思考一下。还有一个问题他没说是什么呢?就是这个东西到底能不能出口中国,这事不知道。刚才5090的时候我们讲了,专门得设计一个叫5090D的东西,是可以出口到中国的。5090的咱们中国的游戏玩家们就别想了。project digITs到底能不能到往中国出口,还得要再等一等,看这个东西也没有那么快了,应该还要再等几个月。

现在我们就是看一个形状就可以了。那么好了,大家是不是应该把钱包掏出来看一看了?我们到底是不是应该要去买这些东西了呢?什么人真正适合去买这个 Project DigITs 呢?

第一个,如果你是有钱人,这个不需要理由,只管买就完了。哪怕买完了以后,你从来都不开机,供奉在那里没毛病。你说我为什么供奉这么个东西在那呢?为你这个仓里边的满仓英伟达股票去祈祷一下不好吗?英伟达这个发布会发完了以后,老黄直接身价上升了,因为股票在暴涨。他已经是世界市值第一的公司了,基本上股票还在三个点几个点蹭蹭涨上去,这是多么神奇的事情。

那你有钱人说我买一个摆家里供起来,没毛病。至于其他的人呢,就真的没必要买这东西了。为什么呢?首先要注意,它里边用的操作系统是一个拿乌班图修改过的定制操作系统,一个用户量不大的操作系统,各种兼容性问题可以把普通用户折腾死。如果你说我不是一个专门的工程师,我就是一个使用 Mac 的用户,或者使用 Windows 的这种桌面用户的话,你就别用这玩意了,这个不是一般人能搞得定的,只有工程师才可以使用这种定制操作系统。

为什么呢?因为它各种的软硬件的配套以及升级,还有这种兼容性都很麻烦。如果真的需要进行大模型训练或者数据分析,这些人说是不是应该去买呢?因为老黄在上面讲了说,我们就是为他们设计的。建议呢,你们还是老老实实的去买通道式服务器。就算你想在家里干这个事,你也去买那个通道式服务器。

为什么呢?因为通道式服务器和 Project DigITs 这种东西,它都是非常非常吵闹的。你要想发挥出这么多算力来,你再怎么设计,它这个功率还是在这的,还是要去散热的。那你干脆就用通道式服务器就完事了,就把它塞到车库、地下室、阁楼,反正这种地方,因为这样的东西,它不适合放在卧室、起居室或者是客厅里边,因为太吵了。而且呢,做这种大模型训练的人最好是用云端的服务器,不要放家里头。

就算是你的数据非常非常的保密,非常敏感,也不建议你在家里边去部署这种东西。为什么呢?因为咱们使用这样的设备呢,都是临时性的,不可能说我一天24小时不停地算这个东西,从来不停,这个事的可能性非常非常小。你可能连续算一周,或者算两周,算完了以后呢,你还是要停下来的。

如果用云计算的这个机房,你只需要为这一两周的时间买单,就可以了。剩下的时间你就不用管它了。那么云计算的这些服务商,就可以把这个主机租给别人了,这个还是非常开心的一件事情。那你说:“哎,我把这东西买回来搁这了。”那你如果不用的时候,难道不是觉得心疼吗?

像这样的主机,正常情况下,如果没有那么高负载的时候,可能也很安静。但是你一看到这个东西很安静的时候,你就想:“哎呀,我这3,000美金是不是花亏了呢?”家里的骡子和马都歇了,这事不行。他会有这样的心理矛盾在这里。

即使你真的是数据科学家,也必须要配一个IT维护工程师,否则你真的没法使这种设备。你就想吧,各种软件的安装,硬件的兼容,这个是很麻烦的。如果我们在云主机上用这个东西,我们是怎么来干这个事的?我们是使用刀客各种镜像来干活的。

这个什么意思呢?就是我们随时需要云主机的时候,我们去跟服务商说:“来,给我搞台新机器来。”然后他把新机器给你了,你就告诉他说:“请按照什么什么样的方式,给我把这个环境搭建好用。”用完了以后呢,说:“现在请回收这台主机。”这个主机就又变成干干净净的了。你下次什么时候再用,你再去跟他说:“哎,给我再去整一台空机器出来。”他再给你整一个干干净净的机器,重新部署。

这个是我们使用云主机的方式。但是我们要想一想,我们用桌面电脑是什么样的方式?那个电脑多长时间格式化一次,多长时间重装一次系统?像我们用麦克的这些人,可能三五年吧,会重装一次系统,这个是正常的。为什么呢?因为这个系统变化相对来说比较少,不会天天的变来变去的。但是这些数据科学家,可能今天我需要用一个这个插件,明天需要用一个那个组件。

这个东西还不停地升级。那你这个玩意儿怎么弄?你就需要不停地格式化电脑,不停地重装电脑。如果没有一个IT工程师跟着你的话,根本搞不定这个事情。就算是正常开机的云主机,我们多长时间格式化一次?可能真的是每个月或者每周,你都会去格式化它。为什么?因为我们需要去维护这个电脑,需要去升级系统。那升级系统你再看看,哎呀,这个升级的东西跟那个兼不兼容,不费劲啊,整个格式化干净,重新整一次就完事了。这是使用云主机的方式。所以没有工程师去维护的话,这个东西摆家里一点意义都没有。

那么最终的结论是什么呢?就是光鲜亮丽的小废物。这个project Digits就算是一个光鲜亮丽的小废物,非常非常贵。如果我们赶个时髦,整一个放家里头,摆起来供起来,平时也没有什么任务让它跑,这个没毛病。你只要有这个钱,没有人能够说你什么。如果你真的想用它,那就算了,趁早打消这个念头。

至于说5090这些东西呢,我觉得你如果真爱的话就去买。现在应该没有什么游戏是必须要5090才能跑起来的。如果你说我一定要去玩stable diffusion,去画一些画,或者我要去做一些渲染的话,哼,也建议用云主机,不要用5090这样的东西出来跑。

所以呢,现在英伟达发布的这些东西,建议大家谨慎购买。至于软件的部分,虽然现在英伟达也在努力的开源,就是他现在新出了一些东西,都是open source的,但是呢,英伟达的软件除非像CUDA那样,一开始在非常小众的领域里头深耕很多年,否则不建议大家去碰这个玩意儿。为什么呢?因为英伟达的软件,用户交互这块是比较差的。英伟达向来不以用户交互这个事情见长,他们都是一帮资深的黑客,一帮这样的工程师范的人。他们认为所有人都应该是工程师。你像刚才我们讲的这个project Digits,这样的东西,如果不是工程师,你根本搞不定这个东西。如果是我整这么一个东西,可能我也得平时把它放在柜子里。

需要去做一些模型。微跳模型训练的时候,把它请出来。机器格式化,整个重装好,然后把一个任务跑完了以后,再重新盖到盒子里头,装柜子里头完事。这个才是他的正常使用方式。等下一次再把他请出来的时候,重新再隔热化机器,重新装系统,这个才可以去正常工作。

所以呢,因为他向来不是给普通用户来用的。就算是你说:“哎,我游戏显卡,难道不是给普通用户用的吗?”是,但是你玩的是显卡的吗?不是,你玩的是游戏。游戏跟显卡之间还是通过各种SDK、各种程序接口在打交道。我们普通人,是不跟那个玩意儿打交道的。而且呢,所有短平快在热点上搞的软件,都不是英伟达擅长的事情。

所以软件呢,跟今天咱们讲的CES消费电子展,这个事就没有什么关系了。就算你说:“我是玩大模型的,我是科学家,我是工程师。”这个事情呢,你可以去进行部署,可以去使用。但是英伟达做的相应的软件呢,特别是在这种热门的领域里头,也建议大家先去使用其他家的,先别用他们家的。因为这些年来,在大模型里头推出的各种软件,其实都没有怎么流行起来。现在大家使的,其实依然是CUDA这个东西。一抽遭蛇咬,十年怕井绳。CUDA大家使习惯了以后,最后就没有办法被他绑架了,必须要使,因为大家继续使下去。

现在老黄就算是摆出再怎么人畜无害的这种表情来,也没有人敢用他们家东西,而且真的不好使。所以在这一块里头,有非常非常多其他公司的这种替代产品、替代的架构可以去用。

好,这就是今天咱们讲的英伟达。黄仁勋穿着他的印花鳄鱼皮夹克,给大家发布的这些东西。然后钱包呢,捂好了,稍微关注一下。特别是project Digits这样的东西,3,000美金对于我来说是比较贵了,可能对于很多人来说好像也不是很贵。但是你先想想你用的了这玩意不?你说如果我摆着,就是为了让英伟达的股票好好的再涨一涨,那你去买,其他的就先别买这东西了。

好,这期就跟大家讲到这里,感谢大家收听,请帮忙点赞,点小铃铛。

参加Discord讨论群。也欢迎有兴趣、有能力的朋友加入我们的付费频道。再见。

🔲 ⭐

【宝藏】揭秘!如何在Dify里免费使用FLUX.1大模型!

今天讲一下如何在Dify里面调用最新的文生图模型FLUX.1。FLUX.1是由Stability,也就是做Stable Diffusion的那家公司的一帮创始元老离职后做的新的文生图模型。现在据说效果非常好,我自己试了一下,确实还可以。那么今天跟大家演示一下如何在Dify里边去使用这个FLUX.1模型。

首先,我们要去找一个云端可以跑的FLUX.1模型。你说我直接到FLUX网站上去行不行?没问题啊,但是他们的这个要付费,特别是FLUX Pro是要付费的。我们先找一个免费的,先跑起来吧,特别是在国内能用的这种免费的,先让它跑起来。我们找到了硅基流动这样的一个网站。我们看一下它这个网站长什么样子。这样前面其实跟大家介绍过硅基流动这个项目,先登录进去。

登录进去以后,我们就可以选择这边的叫文生图了。然后呢,它可以选择FLUX.1-dev。FLUX.1点这个,这个叫这个词就不念了,反正是比较小的这个模型,效果都是很好的,横的竖的都没问题,对吧?然后呢,这个步数,50步到头了,最多就是50步,所以我们就准备来使用这个模型了。

那怎么使用呢?首先要去看文档,对吧?它的API到底是怎么调用的?点一下文档,点到文档以后,我们选API手册,然后呢点击文生图,就到这样的一个页面了。告诉你说我通过CURL怎么去调用的。下一步该怎么办?先把它复制下来。我们到Dify里面去,先增加一个工具,自定义啊,新的一个。在这里呢,我们就要做下一件事了。它使用的是OpenAPI,Swagger这样的一个规范去干活了。我做一个叫随便聊聊的聊天机器人,任何提示词不给他。

然后把 Claude 3.5 Sonnet 直接挂在后面时,我现在就可以跟他聊天了。好,那么我现在要跟他说,请根据以下案例编写一段代码,OpenAPI Swagger 代码,走你。回车,好,他就去干活去了。OpenAPI Swagger 实际上就是包装各种各样的 Restful 代码的一个框架。然后把这一块拷贝下来,我们回到这里贴上,这就是贴好了。以后他就可以去干活去了。哎,先测试一次啊,测试一次。比如说,你看他有这么多的值可以去用啊,这个首先是提示词,比如说“一只喝咖啡看报纸的拟人狗,穿着西装”,好,假设是这样吧。这里呢有一个鉴权方式,什么意思呢?就是很多的这种都是需要授权的,我们需要在这里把我们的 TOKEN 要贴进去。然后 1024×1024 画个方的吧,然后多少步呢,这个 50 吧,刚才不是设到头就是 50 吗?测试一下。呃,这个好像跟我们想象的不太一样啊,我们要求他画这个狗,难道我写错了吗?待会我们想办法让 AI 把我们的语句稍微加工一下,然后再去画。但是呢,至少画成功了啊。再下一步给它起个名字叫 FLUX.1,就这样保存好。我们有了一个叫 FLUX.1,这个前面还有 FLUX.1 from,这是我上次做的。那么下一步我们就要用这个玩意了啊。那么我们去创建一个新的聊天应用,这个应用叫画图。创建模型的话,直接调用 GPT4O mini 吧,然后我们来写提示词。啊,不要看我这提示词写得很长啊,这个没有关系的。而且,这是当时为 DALL.E-3 写的一个提示词。大家可以点击这个按钮自己去生成提示词,这种提示词都是生成出来的啊。我们通过提示词,用户输入信息,生成一个可以画画的提示词。

让他稍微总结一下。然后来工具自定义。刚才我们做的这个FLUX.1,它的提示词是经过加工以后的。然后尺寸,我个人比较喜欢1080P,1920×1080。这个地方的话,50吧,反正多刷几个能够好看一点。好,这个地方就做完了。再往后输出,把提示词放出来,还可以拿它再到MidJourney或者DALL.E-3再画一次,然后再把内容生成的文本输出出来。啊,他最后会给你一个链接,预览一下。一只拟人狗,身着西装,戴着眼镜,喝着咖啡,看着报纸。让我们来试试,画去了。好,让我们看看这幅图怎么样。啊,喝着咖啡,看着报纸,戴着眼镜,穿着西装的拟人狗,对吧?是不是有那么点感觉了?当然,他这个手跟袖子脱开了,稍微差点意思。我觉得已经基本上可以让大家去使用了。

我们今天演示了使用硅基流动的FLUX.1云端模型,而且现在是免费的。使用这种模型,我们到Dify里面去,在工具里面自定义了一个工具Claude 3.5 Sonnet自动生成的。啊,我们只需要把文档里边的这个调用方式扔给Claude 3.5 Sonnet,然后说给我生成OpenAPI Swagger就搞定了。这个里头一个字都没改过,测试成功了以后把API Key输进去。现在的话,你去注册硅基流动会送14块钱,而且这个玩意画多少次不要钱的。

再往后呢,啊,我们演示了使用画图这样的一个流程,先通过GPT-4o mini去做了一个根据输入生成提示词的一个过程。然后呢,再调用刚才我们自己定义的这个插件,生成出来的图片,画出了刚才我们要的这张穿西装、戴眼镜、喝咖啡、看报纸的拟人狗。这就是我们今天给大家演示的,这就是我的一个AI课程。

今天呢,把这个节目放在公众频道里,但是更多的课程呢是在付费频道里。为什么在那边呢?啊,因为这种课程其实看起来比较累,不在公众频道里影响大家了。不过今天这个因为比较好玩,所以跟大家演示一下,具体怎么去装 Dify,具体怎么去给里面做各种配置的课程,是在我们的付费频道里。今天就跟大家讲到这里,感谢大家收听,再见。

🔲 ⭐

教程-成熟的核显已经能像独显们一样画画了

诈尸更新

配置:AMD Ryzen 5 2500U with Radeon Vega Mobile Gfx

增加核显显存

WARNING: USE AT YOUR OWN RISK

下载 UniversalAMDFormBrowser.zip (位于 DavidS95/Smokeless_UMAF

如何使用

解压到FAT32 U盘,开机从U盘启动(方法略),会加载自定义bios UI,现在如果进入Device Manager,AMD PBS/CBS就在那里,你可以修改你想要的,完成后,直接按esc直到它请您保存。

在 AMI Bios 上,除了 AMD PBS 和 CBS 也会显示“Setup”,这是常规的 bios,这里的编辑可能不会保存(AMD PBS/CBS,Aod Setup)

展开/折叠 翻译前原文 How to use it

Extract in a FAT32 USB, and boot from it, it will load the custom bios UI, Now if you enter Device Manager, AMD PBS/CBS will be there, you can modify what you want, and when done, just hit esc until it ask you to save.

On AMI Bios, in addition to AMD PBS and CBS will be shown also "Setup", this is the regular bios, the edit here might not be saved (AMD PBS/CBS, Aod Setup)

主菜单 -> Device Manager -> AMD CBS -> NBIO Common Opinions -> GFX Configuration(选项位置可能不同,仅供参考)

  选中, enter, ↑ ↓, enter  
Intergrated Graphics Controller <Forces>  
UMA Mode <UMA_AUTO>  
UMA Version <Auto>  
Display Resolution <3840x2160> (选最大的)

其实 UMA Mode 还可以选另一个选项来手动指定显存大小(UMA Frame buffer Size),但是我这里改了没用。只能用上面这个方法,把显存从1G改到2G

修改完了esc退出,退到AMD CBS这一级菜单时会弹出确认保存的窗口,按y确认保存

ctrl+alt+del重启,任务管理器,确认修改生效

安装运行

Install and Run on AMD GPUs · AUTOMATIC1111/stable-diffusion-webui Wiki (github.com)

Windows+AMD的支持还没有正式为webui做, 但您可以安装 lshqqytiger 的使用 Direct-ml 的 webui 分支。

  • 训练目前不起作用,但各种功能/扩展都可以,例如 LoRAs 和 controlnet。 在 https://github.com/lshqqytiger/stable-diffusion-webui-directml/issues 报告问题

安装 Python 3.10.6(勾选添加到路径)和 git 将此行粘贴到 cmd/terminal:

git clone https://github.com/lshqqytiger/stable-diffusion-webui-directml && cd stable-diffusion-webui-directml && git submodule init && git submodule update

(您可以将程序文件夹移动到其他地方。) 双击 webui-user.bat 如果在安装或运行时看起来卡住了,请在终端中按回车键,它应该会继续。

展开/折叠 翻译前原文 Windows+AMD support has not officially been made for webui, but you can install lshqqytiger's fork of webui that uses Direct-ml.

-Training currently doesn't work, yet a variety of features/extensions do, such as LoRAs and controlnet. Report issues at https://github.com/lshqqytiger/stable-diffusion-webui-directml/issues

Install Python 3.10.6 (ticking Add to PATH), and git
paste this line in cmd/terminal: git clone https://github.com/lshqqytiger/stable-diffusion-webui-directml && cd stable-diffusion-webui-directml && git submodule init && git submodule update (you can move the program folder somewhere else.)
Double-click webui-user.bat
If it looks like it is stuck when installing or running, press enter in the terminal and it should continue.

按照上面的步骤,运行webui-user.bat(确保互联网连接通畅)便会全自动安装依赖项,甚至帮你下好模型 (v1-5-pruned-emaonly.safetensors),然后会直接运行webui。然而我们不用它自动运行的因为没加参数,看到输出中已经开启了位于http://127.0.0.1:7860/的gradio服务器然后给你输出了启动用时就证明已经装好全部依赖加载好模型正在运行了,ctrl+c直接终止就行

如果已经下载过了v1-5-pruned-emaonly.safetensors,那么在运行webui-user.bat前将其置于models\Stable-diffusion然后再运行脚本安装(当然用mklink创建符号链接也行)

至于模型的选择,最好用FP16量化过的模型,占用显存较低(?需要验证)

运行webui.py,附加参数--medvram

E:\stable-diffusion-webui-directml>venv\Scripts\activate.bat
(venv) E:\stable-diffusion-webui-directml>python webui.py --medvram
Warning: experimental graphic memory optimization for AMDGPU is disabled. Because there is an unknown error.
Disabled experimental graphic memory optimizations.
Interrogations are fallen back to cpu. This doesn't affect on image generation. But if you want to use interrogate (CLIP or DeepBooru), check out this issue: https://github.com/lshqqytiger/stable-diffusion-webui-directml/issues/10
Warning: caught exception 'Torch not compiled with CUDA enabled', memory monitor disabled
No module 'xformers'. Proceeding without it.
Loading weights [d1facd9a2b] from E:\stable-diffusion-webui-directml\models\Stable-diffusion\anything-v3-fp16-pruned.safetensors
Creating model from config: E:\stable-diffusion-webui-directml\configs\v1-inference.yaml
LatentDiffusion: Running in eps-prediction mode
DiffusionWrapper has 859.52 M params.
Downloading (…)olve/main/vocab.json: 100%|██████████████████████████████████████████| 961k/961k [00:00<00:00, 1.74MB/s]
Downloading (…)olve/main/merges.txt: 100%|██████████████████████████████████████████| 525k/525k [00:00<00:00, 1.57MB/s]
Downloading (…)cial_tokens_map.json: 100%|█████████████████████████████████████████████| 389/389 [00:00<00:00, 194kB/s]
Downloading (…)okenizer_config.json: 100%|█████████████████████████████████████████████| 905/905 [00:00<00:00, 450kB/s]
Downloading (…)lve/main/config.json: 100%|████████████████████████████████████████| 4.52k/4.52k [00:00<00:00, 2.26MB/s]
Applying cross attention optimization (InvokeAI).
Textual inversion embeddings loaded(0):
Model loaded in 48.4s (load weights from disk: 0.4s, create model: 11.1s, apply weights to model: 23.6s, apply half(): 13.0s, load textual inversion embeddings: 0.1s).
Running on local URL:  http://127.0.0.1:7860

To create a public link, set `share=True` in `launch()`.
Startup time: 59.9s (import torch: 3.9s, import gradio: 1.9s, import ldm: 0.9s, other imports: 2.0s, setup codeformer: 0.1s, load scripts: 1.4s, load SD checkpoint: 48.5s, create ui: 0.9s, gradio launch: 0.3s).

Read more

Optimizations · AUTOMATIC1111/stable-diffusion-webui Wiki (github.com)

Troubleshooting · AUTOMATIC1111/stable-diffusion-webui Wiki (github.com)

Command Line Arguments and Settings · AUTOMATIC1111/stable-diffusion-webui Wiki (github.com)

🔲 ☆

最近在玩的东西

其实最近也一致在看电脑科技史上的重要革新,说发明还是太大了。

比如之前看的 ChatGPT,人工智能在自然语言方面的巨大进步,尝试使用了一段时间。暂时还感觉不到对自己的工作帮助有多少。

在比如之前用过 Midjourney, 通过 Discord 来发送咒语(指令,提示词)之后 Midjourney 就能生成图片。这蛮有意思的,也有很多意外之喜。

而最近则是在看 Stable Diffusion,这是一个深度学习,文字到图片的模型,开源的。很厉害,很快就疯魔了。 Twitter 上除了 ChatGPT 就是 Stable Diffusion的各种消息。

于是我也尝试在本地搭建系统,能跑起来,不过因为没有高级显卡,靠 CPU 跑,这种痛苦谁用谁知道。几分钟出一张图片。训练是完全不现实的。

还好有人给出了用 Google 的 Colab 来跑的方式,也试了一下,可以训练,可以跑,网上有太多的教程,就不多说了。

放几张图片吧,使用 CPU 生成的。

00011-1381345044.png00002-908192234.png00001-3293928558.png00000-2341315.png

接下来的兴趣项目,是做木工。等开始制作了再聊。

🔲 ☆

能量奇点完成近4亿元首轮融资 个人认为是中国最有前途的受控核聚变项目

昨天看到我朋友杨钊创办的能量奇点官宣了《能量奇点完成近4亿元首轮融资,用于探索可商业化的聚变能源技术 》,激动的半天没睡着觉😂 虽然我这么说可能有点不客观,但是我认为这是中国最有前途的受控核聚变项目。

利益相关 disclaimer:这是我朋友创办的公司,我因为个人原因没有参与其中,只是在场外摇旗呐喊,是纯粹的精神股东。我已经不在科研界,这篇文章的言论只代表个人观点,希望前同行们轻喷。

我认为目前受控核聚变的最大困境,主要不在于物理机制的研究上,而是在于政府的资金支持不够。制造一个大型实验装置是非常烧钱的。美国对于聚变的经费投入在过去几十年来基本维持不变,通胀调整后就相当于逐年递减了;而本来最有希望的 ITER 项目,则由于国际合作的种种弊端,工程一再延期,也给这个行业蒙上了一层阴影。对行业的悲观也是让我做出不再继续在这个方向做科研的原因之一。

然而事情其实还是有转机的。在过去的十年里,其实有一件事在悄悄发生,那就是高温超导材料–钇钡铜氧–逐渐的技术成熟,可以被量产做成线圈产生比较大空间范围的强磁场了。到今天百度百科里面还写着钇钡铜氧相当于是一种陶瓷材料力学性质不易弯折且易碎因此很难被做成导线呢,但其实这些年技术在静悄悄的进步,困难在逐渐的被客服。这类高温超导材料,可以有更高的临界温度、更大的临界磁场,因此是产生强磁场的理想材料。如果使用了这种材料,理论上可以设计让托卡马克运行时的磁场比低温超导材料高出数倍,因此约束性能更好,用更小型的装置就可以实现同样的点火目标。目前钇钡铜氧高温超导材料的主要问题之一就是贵,成本大约是低温超导的十倍,但是如果熟悉各种技术的历史就知道,新技术贵不是问题,只要应用范围很大,需求量上去了,将来这个材料的生产成本是可以指数衰减的。

因为政府的支持力度不够,而建造一个全新的大型装置太烧钱,所以实际上美国第一个提出要搞高温超导路线的团队,就搞成了一个商业公司:Commonweatlth Fusion Systems (CFS)。CFS背靠MIT,2018年种子轮就融资拿到了$50M的融资,2022年进行到了B论已经拿到了$1.8B的融资。

目前国内最先进的EAST装置,是基于低温超导材料的,其上限也就不过如此了(国际上已建成的大型装置也都一样),这是一个主要用于做物理实验和工程验证的装置,从设计上就不可能达到点火条件。而目前国内另一家有一定前途的做聚变的公司–新奥能源–走的是更低成本而小型化的路线,按我的理解他们的目标不是去冲击能量输出大于输入,而是也是研究物理。在我看来,做一个全新的基于高温超导的装置,是正路。这其实也是业界很多大佬们的看法。

能量奇点正是计划走高温超导这条正路的新公司,和美国的 Commonweatlth Fusion Systems (CFS) 一样。之前我还有点担忧这条正路如此烧钱,杨钊到底能不能搞到足够的资金来支持他的疯狂计划?现在看来,这个顾虑已经不存在了。首轮融资就融到了将近4亿元,已经和 CFS 的$50M种子轮相当了。而我们都知道,同样的资金,在中国使用成本更低、办事速度更快。

我对这家公司和受控核聚变的未来,预期是什么样的?分为几个层级来说吧:

  • 这家公司能做到聚变能商业发电吗?我依然觉得不仅这家公司做不到,可能我这辈子都看不到。
  • 这家公司能做到能量输出大于输入吗?如果是定义成中子能量输出大于能量输入,也就是不考虑中子转化成电能的不可避免的能量损耗,那么我觉得有一定希望、但是也不是一定会实现的,难度非常大,挑战非常高。
  • 这家公司能做到等离子体稳定高参数放电吗?我觉得这个大概率可以成功。
  • 这家公司能推动从高温超导材料到等离子体控制等上下游的科学和技术进步吗?我觉得这100%可以做到。这也就是为什么尽管我对聚变的前景依然感到悲观,但是我仍然非常激动非常看好这家公司的发展。

感兴趣的朋友如果想加入,可以联系 hr@energysingularity.cn 加入他们~ 这里是岗位和要求信息。希望能量奇点可以越做越好!…

The post 能量奇点完成近4亿元首轮融资 个人认为是中国最有前途的受控核聚变项目 appeared first on physixfan.

❌