Aioga
AI资讯 / 行业动态
返回 AI资讯

用 TRL 和 OpenEnv 训练编码模型画水彩:Hugging Face 全流程开源复现

Hugging Face:Blog(RSS)Aioga 编辑团队2026-09-03T00:00:00.000Z热度 72

Hugging Face 博客作者基于 Surya Narreddi 的原始想法,用 TRL、OpenEnv 和 Qwen/Qwen3.5-35B-A3B 复现了让语言模型通过...

行业动态Hugging Face:Blog(RSS)

今日 AI 情报摘要

Hugging Face 博客作者基于 Surya Narreddi 的原始想法,用 TRL、OpenEnv 和 Qwen/Qwen3.5-35B-A3B 复现了让语言模型通过 p5.brush 写

JavaScript 画水彩的 RL 训练流程,所有数据集、环境、脚本和模型均开源在 Hub。

中文正文 · AI 翻译

人们为什么喜欢它:#why-people-loved-it RL 胜于口味:#rl-over-taste 你需要构建的 RL 环境:#the-rl-environment-you-need-to-build 池子就是奖励函数:#the-pool-is-the-reward-function 再来一次 yolo 运行:#just-one-more-yolo-run 它实际学到了什么:#what-it-actually-learned 基础设施很难:#infra-is-hard 它的成本:#what-it-costs 我接下来会尝试什么:#what-i-would-try-next 我对原始内容的修改:#what-i-changed-from-the-original 一切都已发布:#everything-is-published:https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/blog/train-to-paint-with-code/thumbnail.png

用 TRL 和 OpenEnv 训练编码模型画水彩:Hugging Face 全流程开源复现
用 TRL 和 OpenEnv 训练编码模型画水彩:Hugging Face 全流程开源复现

在8月23日,Surya Narreddi 发布了一段由语言模型创作的水彩画美丽视频。该模型通过 p5.brush 写 JavaScript:https://github.com/acamposuribe/p5.brush,这是一个“为 p5.js 添加自然绘画工具”的库。该视频迅速走红,截至撰写本文时已超过 150 万观看。

视频配有一篇博客文章,解释了项目早期较为狭窄阶段的训练过程,主要是近景花卉,而不是视频中的完整构图,可惜尚未公开相关素材。他的网站表示完整技术报告即将发布,因此一定要关注他。原始想法出自他本人,来自艺术和设计方面,他的技能远超我:https://x.com/kickingkeys/status/2094901433149612118。我的尝试在工程方面,公开复现其方法,每一部分都已发布。

注意:关于该项目的背景,由 Surya 本人讲述,请观看他论文的视频。

在本文中,我尝试使用 TRL:https://huggingface.co/docs/trl 和 OpenEnv:https://github.com/huggingface/OpenEnv 来复现他的想法。参考池数据集、RL 环境、训练脚本以及训练模型均已开放。

整个管道端到端地在 Hugging Face 上运行:

一旦两个 Spaces 启动,该流程只需一条命令。复制环境:https://huggingface.co/spaces/HuggingEnvs/watercolour-env 和评分模型:https://huggingface.co/spaces/HuggingEnvs/watercolour-hpsv3,设置奖励组合的两个环境变量,然后启动:

本文剩下的部分讲述了到达这一点的过程,每一部分都在仓库中。

我严格按照原博文的步骤操作,只有在绝对必要时才做了修改。我自己的所有想法都记录在一个清单里,而不是直接融入实验中,这个清单最终成为“我接下来会尝试的内容”,放在全文发布成果的清单旁边。如果你已经读过他的文章,框架和奖励设计会让你感到熟悉。新的内容是开源实现、人工评分的数据集,以及三个经过训练和比较的奖励组合,从“你需要构建的 RL 环境”开始。

这些画作看起来自由、不完美、手工制作,而现在的图像模型生成的图片通常是完美(统计上平均)的。我猜这种对比是视频走红的重要原因之一。它让我想起生成式 AI 艺术的早期阶段,当时的重点是探索媒介。DeepDream:https://research.google/blog/inceptionism-going-deeper-into-neural-networks/(2015)最初是一个调试工具,但人们将其变成了艺术作品,类似 Edmond de Belamy(2018)的作品源自艺术家探索 GAN 的能力,而像 Mario Klingemann:https://quasimondo.com 这样的艺术家在那些年用神经网络制作梦幻肖像:https://artsandculture.google.com/asset/memories-of-passerby-i-mario-klingemann/aAHG7iV3aXme8g。

这个项目感觉更接近那些早期的日子。在他的论文中,Surya 描述了通向这一点的路径。他一开始是通过提示文本生成图像模型,其中提示是你唯一能控制的要素,而增加细节只能在一定程度上获得更多控制。训练模型本身可以走得更远。另一半的理念是媒介。模型生成了大约 150 行 JavaScript 的程序来绘制图像。那个模型输出的就是代码。你可以阅读、编辑并再次运行它,每一笔背后的决策都是可见的。风格来源于一个限制:模型只允许使用库中的十种方法。更多内容详见下文。

在同一时期,Anna Ridler:https://annaridler.com/works/myriad-tulips 拍摄了数千朵郁金香,为每一朵手工标注,并将数据集本身作为艺术作品展出,后来又在其上训练了一个模型。我通过 AI 代理在构建这个项目时带回的参考资料发现了她的作品,并很喜欢它,因为这个项目通过手工策划一组图像然后进行训练,做的事情与她的作品非常相似。

最近大多数关于语言模型的强化学习(RL)工作都使用可以验证的奖励。例如,有已知答案的数学题、可以通过测试的代码,或者可以正确或错误运行且成本低的评分器。这个项目更接近旧的例外,RLHF(基于人类反馈的强化学习),模型从人类偏好中学习奖励模型。

这里的奖励是审美偏好。没有正确答案。项目真正的问题是是否可以在品味上进行强化学习。

奖励,如他的博客所定义的,以及我构建的 RL 环境所实现的:

HPSv3:https://huggingface.co/MizzenAI/HPSv3 是一个开放的 7B 偏好模型。给它一张图片和文字描述,它会返回一个分数,表示一个人对该图片的偏好程度。它是在大量人类对图片成对选择的数据集上训练的,因此其分数是许多人品味的平均。成对评判工具是 Qwen3-VL-30B-A3B-Instruct:https://huggingface.co/Qwen/Qwen3-VL-30B-A3B-Instruct,这是一个通用视觉模型,通过 HF 推理提供者调用。成对评判工具在四个随机从池中选出的参考图像旁边查看候选画作,并根据书面描述指引要权衡的因素(如溢出、半透明水洗、柔和边缘),每种比较都以两种展示顺序进行,其分数是候选画作获胜比较的比例。它唯一的标准是池,因此其分数就是我的品味,编码在这些评分中。

这些是 Narreddi 收敛的权重。这里的池定义了品味。这将工作从调整超参数转向构建决定何为美的集合。

我用这个奖励训练了三次运行。它们的区别仅在于两个模型评判器之间权重的分配方式:

我从仅使用 HPS 开始,以验证整个流程是否能够学习。一旦奖励上升且指标健康,就没有理由继续长时间运行,所以我改而启动了两个较长的运行。较长运行提出的问题是:HPSv3 的能力有多少可以交给成对评分者?评分者的权重越大,奖励就越代表我的个人喜好而不是所有人的喜好,爬升就越困难。顺便提一下,如果你推得足够远,或者你的风格与平均水平差距过大,模型可能会完全停止。

幸运的是,它并没有停止,并且两个带有成对评分的运行也学会了。手动评分的样本池至少在指标和最终的绘画作品上显示,它能引导策略。数字如下。

免责声明。如果我们使用前沿模型,它已经可以从提示生成绘制水彩的 JavaScript 代码。这是起点。这里的工作是关于教一个较小的模型结合个人艺术偏好来完成这件事。

环境封装了模型与奖励之间的所有内容,包括模型用于绘画的 JavaScript 库、限制模型的系统提示、渲染每个草图的无头 Chromium,以及拒绝作弊的闸门。

这个库比看起来做的工作更多。p5.brush:https://github.com/acamposuribe/p5.brush,由 @acamposuribe:https://x.com/acamposuribe 创建,它模拟的是一种媒介,而不是绘制形状:颜料会超过填充边界,纸张有纹理,笔触有重量,流场会拖动刷子工作。当模型调用 brush.fillBleed(0.25),它是在决定墨水的扩散距离。

注意。p5.brush 的作者早在这一切之前就试图教机器作画。2022 年,他创作了一个生成艺术系列,隐藏了一个教 p5.js 像孩子一样绘画的日记:“它几乎不能使用蜡笔[...] 它无法遵循简单的指令。我今天到此为止,真让人恼火。”该系列原本计划有三件作品,他只做了两件。当 Surya 的视频走红时,他引用了该日记,并分享说这项工作是第三件作品,自然而然地出现了。

p5.brush 提供了 47 种方法。提示允许使用 10 种方法:scaleBrushes、noStroke、fill、noFill、fillBleed、fillTexture、beginShape、vertex、endShape 和 circle。其他三十七种方法,如添加线条、填充、定制画笔,会破坏水彩的效果。使用这十种方法,模型只能绘制填充形状,库会为每一个形状添加渗色效果。

他的博客文章为我节省了大量可能浪费在迭代提示上的时间。长长的 API 参考会让模型发明不存在的方法,而他的 200 次 GEPA 迭代收敛到一个严格的允许列表,没有任何文档。我看到同样的失败,并手动写下了允许列表。我对这个方案唯一的补充是一句话:每个花瓣涂两到三次,先大范围涂一遍,再在里面涂一层更小、更不透明的。这一小的变化让我的输出更丰富多彩。

注意:如果这是你第一次听说 GEPA:https://huggingface.co/papers/2507.19457,它是一个自动提示优化器。语言模型用简单的语言反思当前提示失败的原因,并提出更好的提示,然后循环重复。

最后的关口是关键。草图必须能够编译,使用库而不是直接调用 p5,真正把颜料放到画布上,并且不要尝试欺骗评分者,例如在画布上写文字。

素材库包含 178 幅作品:https://huggingface.co/datasets/HuggingEnvs/watercolour-reference-pool,根据我的个人喜好分为两类:喜欢和一般。所有作品实际上都是模型生成的。四个开源权重模型,通过推理提供者调用,绘制了 p5.brush 草图,每个模型都基于来自 iNaturalist 的真实、开源许可的木槿照片。一种视觉模型对每幅草图给出了文字反馈,经过三轮优化。每个最终渲染结果随后由我逐一评分,其中 178 幅通过了筛选。

在这里,我选择了四种不同系列的模型来测试它们的不同风格。这四个都是开源模型,在快速可靠性检查中每次都能生成有效草图,另外两个候选模型因未通过而被排除。如果你想生成自己的素材库,也可以选择其他模型。

奖励中的各个层级确实起作用。当成对评审抽取四个参考时,一半来自“喜欢”,一半来自“还行”,因此策略总是面临一些它有时能击败的对手,而获胜时无论针对哪一层级支付的奖励都是相同的。这是我少数几个有意更改之一:原版只与其顶层比较,而我在抽取时保留了较容易的层级,这样早期较弱的策略也能获得信号。

这里没有任何人工绘画作品,这确实是一个限制。p5.brush 是一个小众库,并且其中可访问代码的人类作品只有少量,远不够构成训练语料库,他的博客中也提到过这一点。

正如我之前已经讨论过的,有趣的想法是模型将学习模仿池中包含的内容。如果我们让环境指向不同的数据集,奖励会自动变化,而无需修改任何一行代码。对于我生成并公开分享的数据集,我还包括了源草图。

如果我们仔细观察评审,两位评审回答的问题不同。HPSv3 判断它是否为一朵花,而成对评审判断它是否以我选择的风格画得好。

在一切成功之前,奖励曲线曾有一段很长的平坦期。如果你尝试过在没有开放资源的情况下复现论文或博客,你大概能理解。每一次运行都测试了我认为合理的理论,即哪里出了问题。一次运行需要很多时间,所以我在分析上一轮结果的同时排队进行了下一次运行。一如既往,从一些容易且可行的东西开始,然后在其基础上构建,是解决问题的办法。一个简单的控制任务,没有浏览器和评审,是第一次学习成功的尝试,原因是我的学习率当时太低。

另一个让我花时间去发现的变化是正确调整 LoRA 参数。通常的 target_modules 列表假定是密集模型,而 Qwen/Qwen3.5-35B-A3B:https://huggingface.co/Qwen/Qwen3.5-35B-A3B 是一个专家混合模型,它的大多数投影层命名不同,所以适配器只训练了四十层中的十层。我通过将其改为 all-linear 解决了这个问题,这样就能覆盖每个线性层。这个架构中的路由专家是融合的张量,即使 all-linear 也会保持冻结,但其他所有部分都会有适配器,而这已足够学习。

这个修复在 TRL 的 GRPOTrainer:https://huggingface.co/docs/trl/grpo_trainer 中涉及四个改动:

这四个改动解锁了第一次成功运行(仅 hps),奖励明显提高。

在该配置下,所有三次运行都能学习。两个 judge 运行启动了 200 步,但在 110 步时停止,奖励仍在缓慢上升。每步耗时十五到十八分钟,并且不同混合的比较已相当稳定,所以我停止了两次运行以节省计算资源。每次运行前后三分之一的平均组奖励:

这三条曲线与我的口味权重一致。裁判权重越大,起始越低,上升越噪。judge-led 前三十步几乎保持平稳才开始上升。正是这一变化解决了调试问题。缩小问题,直到有东西可以学习,然后再一次添加困难部分。

在使用 pairwise judge 的两次运行中,该项本身有所上升。随着训练进行,模型在与池子的比较中获胜更多,这是 hps-only 无法做到的。在任何一次运行中都没有组崩溃为相同的奖励,而这是 GRPO 的失败模式,会破坏梯度。对于好奇者,每项指标的曲线(HPSv3、覆盖率、熵)在仓库中有 CSV 文件。

完整的启动命令、硬件以及两个环境变量,这些将其转换为另外两次运行,在说明文档中有说明。

每次运行中,模型学到的第一件事就是停止制作糟糕的画作,那些几乎空白的画布和无形状的洗涤,总奖励得分低于0.3。在仅有HPS的游戏中,该组的增长有四分之三来自于劣质画作变得稀有。在评审回合中,崩溃更为陡峭:评审主导的三分之一中,低于0.3的出场次数从99降至16,而在HPS领导的则从37降至4。

这就是为什么显而易见的可视化——每步的最佳绘制——在仅 hps 的表现上几乎没有差异。它在整个过程中移动 +0.034,而中位数移动 +0.155。学习过程在分布中间可见。

两人评审改变的是顶部。在仅有 hps 的作品中,画作变得更可靠但没有变好。优秀画作的质量只为群体平均增加了 +0.03,一旦 HPSv3 看到中心和花茎周围有花瓣,就不再要求更多颜料。评委开启后,故事的另一半出现。这里的“更好”意味着更接近池塘,也更接近我评为“好”或我更喜欢的东西。这增加了评委主导的 +0.12 和 hps 主导的 +0.16,每个步骤中最好的也上升了,颜料覆盖率在两轮中翻倍(0.11 到 0.23,0.13 到 0.30),而仅用 hps 几乎没有变化。有了参考点需要打败,一幅好画依然可以变得更好,模型也开始因使用更多颜料而获得奖励。

还有一个发现。模型忽略了显式指令,这样做是正确的。系统提示请求十五到三十个填充形状。如果看实际平均值,它介于7到9之间,且n_shapes与任何运行中的奖励几乎无关(+0.000, −0.14, +0.07)。策略不会因服从该句子而获得奖励,因此不服从。

仅使用HPS路线也有上限。如果每次推出都匹配其良好路线,该运行的平均值将达到0.771。是否会通过更多步骤打破它,尚不清楚。

这些画作还展示了一些表格没有体现的东西。在每一次运行中,它们看起来都很相似。随着训练的推进,每组内部的奖励越来越接近,开头视频中的中位画作就像是同一朵花的不同拍摄镜头。这就是GRPO在一个主题构建的池中所设计要做的事情。这个池决定了什么算作多样性,就像它决定什么算作质量一样。如果奖励只针对匹配一朵花,模型就会学会画那朵花。要得到更多样化的输出,需要一个更多样化的池,而建立这样一个池需要更多的策展工作。Surya的新作就是一个例子。Alex Yango的动物画也是同样的做法,只是池中的选择不同。这是审美奖励和数学评分器之间最大的区别。在数字背后,有一个非常人性化的工作,那就是决定哪些内容应该进入奖励集。Jason Liu关于品味的文章用一句话概括了这个通用版本。AI把瓶颈从创作转移到了观察。

Surya在博客结尾处展示了他的一些最爱。下面不是我的选集,而是一面墙,展示了奖励在两次评审过程中评分最高的178幅画作,这个数字和参考池的数量相同,顺序无特定排列。打开它,然后挑选你自己的最爱。

要做出选择,你需要看过许多作品并保留一些,而这正是构建本项目奖励的工作。每一次运行的每一幅画作,包括它的草图和奖励,都在rollouts数据集中,并且可以在这个画廊中浏览:https://huggingface.co/spaces/HuggingEnvs/watercolour-gallery。

由于奖励部分基于我的品味,以观者的身份给出结论是公平的。依我之眼,judge-led 是最终最具多样性和艺术趣味的运行。hps-led 则画出令人信服的水彩画,但它最好的作品都带有一种柔和、湿对湿的效果,几乎形成了其独特的风格。hps-only 收敛得最明显,它的大部分画作颜色都趋于一致。你可以在画廊中自行评判,那里收录了每一次运行的每幅画作,可以按步骤和奖励排序。

这个项目主要是基础设施。一次运行需要一个训练器、两个空格、一个推理路由器和一个网页接口,才能连续几个小时保持健康,而每一个悄悄失败的部分都会变成别处的错误数字。一半的工作都在核对你读到的数字是否与实际发生的情况相符。

基础设施故障会以零分进入奖励。超时渲染或评分者未回答,得分和糟糕的画作一样,组内得分为0.0。在我所有的运行中,这大约占rollout的1.5%,最糟糕的一次运行中达到了5.2%。这会训练模型使用噪声,所以这些路径现在返回为无,rollout被排除在组之外。

我还发现OpenEnv有个bug,并把修复问题上游了。客户端保留一个持久的Websocket,远端关闭的另一个socket缓存,所以每次后续调用都失败,尽管环境很健康。我花了两次半完成的运行才找到它。修复问题被提交上游,启动的运行从那以后一直运行干净。

每一步的奖励取决于它绘制的参考。两两评委每步抽取四个参考,因此每一步面对不同的对手,有些抽牌更难。GRPO本身大多安全,因为优势是在组内计算的,硬抽牌会让整个抽牌一起移动。我读到的曲线并不安全,有些看似糟糕的步骤其实只是硬抽。上面的图片就是一个例子。第12步得分比第11步低半分,主要是因为它抽到了本轮最难的参考,而画作本身看起来很接近。

四舍五入的数字,且仅限完成的跑数。

每一步需要八次滚动,耗时十五到十八分钟,其中70%到80%用于渲染。单次渲染需要69到96秒,截止时间为90秒。这部分是预期中的,Space没有GPU,所以Chromium在软件中渲染WEBGL画布,p5.brush的出血和纹理是大量像素工作。即便如此,我本以为会更快,但还没找到全部原因。

计分器的成本可能比训练费用还高:HPSv3必须全程开启,所以跑完后暂停空格或设置睡眠计时器。

一切都运行在 HF Jobs 上,环境作为 Docker Space:https://huggingface.co/docs/hub/spaces-sdks-docker 和 trackio 中的指标:https://huggingface.co/docs/trackio。

这个项目的规则是用所有资源开放的方式复现配方,而不是改进它,因此在过程中积累了一份未尝试过的创意清单。这些是我实际会尝试的想法,按证据多少排序。

情报判断

Aioga 编辑摘要

Hugging Face 博客作者基于 Surya Narreddi 的原始想法,使用 TRL、OpenEnv 和 Qwen/Qwen3.5-35B-A3B,复现语言模型通过 p5.brush 编写 JavaScript 绘制水彩的强化学习训练流程,并公开数据集、环境、脚本与模型。

背景分析

Surya Narreddi 曾发布语言模型绘制水彩的视频;原项目较早阶段聚焦近距离花卉,相关技术报告和开放产物当时尚未完整发布。Hugging Face 作者从工程侧尝试复现该想法,并将流程部署在 Hugging Face 上。

Aioga 观点

Aioga 判断:该项目值得关注之处在于,来源材料明确提到参考池数据集、强化学习环境、训练脚本和训练模型均已开放,使这次工程复现具备较清晰的材料基础。

影响与后续

可能影响:相关开放材料可能降低复现该训练流程的准备门槛,但不代表一次复现就能证明方法适用于其他创作任务;训练效果仍需要结合奖励设置、环境和模型结果进一步核验。 后续观察:需要关注文中提到的环境、评分模型、数据集、脚本和训练模型是否持续可用,并等待 Surya Narreddi 所述完整技术报告,以进一步核对原始项目与此次开放复现的差异。

来源与版权说明

本页正文由公开来源页面提取并按原有信息整理,同时保留来源、发布时间和原文入口。版权归原作者及来源网站所有,请通过原文链接核验和阅读来源版本。

抓取通道: RSS · 原始域名: huggingface.co

来源: Hugging Face:Blog(RSS)

原文链接: 打开原始来源

Aioga 归档: 查看情报页

Content record: source-page · Updated: 2026-09-03T00:00:00.000Z

API 中转站
API RELAY · DEVELOPER INFRASTRUCTURE

API 中转站

统一接入主流 AI 模型 API,为开发、测试与生产环境提供稳定调用入口。

立即访问 api.w173.com
AIOGA SHARE POSTER

分享这篇 AI 情报

Hugging Face 博客作者基于 Surya Narreddi 的原始想法,用 TRL、OpenEnv 和 Qwen/Qwen3.5-35B-A3B 复现了让语言模型通过...

Hugging Face:Blog(RSS)2026-09-03T00:00:00.000Z
扫码打开文章详情扫码直达文章详情

Aioga 自动聚合全球 AI 动态,并保留来源信息用于核验与引用。