微调Gemma3:文本生成CAD
这是一个使用小型语言模型创建3D模型的实验项目。
在CloudRift和Prime Intellect提供的GPU算力额度以及Huggingface慷慨的免费资源支持下,我开始构建一个用于生成3D文件的语言模型——CADMonkey。
1、模型架构与3D编程语言
在Starmind,我们需要模型足够小巧,能够在树莓派4和5上运行。
基础语言模型选择的是Gemma3-1B,原因如下:
- 易于微调(也就是说不需要花费10多个小时调试代码)
- 没有对话模板(便于开发和使用)
- 训练工具(Unsloth)、部署和量化(llama.cpp)已经成熟
我们也曾简单考虑过扩散模型,但开发复杂度太高。也许改天我们会重新审视这个想法。
该模型将生成OPENSCAD代码,用于渲染3D模型。
为什么选择OpenSCAD?作为一名机械工程师,我发现传统的体素和网格3D模型几乎没有价值。工程需要不断的修改和迭代,而基于形状和基于代码的模型正好适合这一点。
2、数据集生成
你的模型好坏取决于你的数据集。但"好"的定义取决于具体任务。
以下是我们创建数据集的尝试:
#1:Huggingface上有从Thingiverse抓取的开源OpenSCAD数据集,约7,000行数据(redcathode/thingiverse-openscad)。然而,我们有几个问题:
- 代码结构过于多样化,代码质量不高。这导致训练后的模型生成不连贯的代码(Python和C的混合)。
- 数据集中的物体不是常见物体,而是"某个特定东西的特定齿轮"类型。这无法教会模型代码的语义含义。
#2:合成数据生成是我们选择的方法。
- 首先,我们按类别(动物、厨房用具、宝可梦等)创建常见物体名称列表。然后,让大型语言模型(Kimi)生成代码,渲染代码,并使用VLM(Qwen2.5-VL)根据相似度评判输出结果。
结果就是这个数据集:https://kdataset.web.app
这是互联网上第一个大规模合成生成并审核的OpenSCAD数据集:ThomasTheMaker/Synthetic-Object-v3(35,000行已验证数据)。
如果没有CloudRift提供的资助,这一切都不可能实现。非常感谢!
在数据集上微调模型后,我们发现:
- 模型80%的时间能生成可运行的OpenSCAD代码
- 但是,代码与物体不匹配。
事实上,只有1/400的模型与物体匹配。下面是唯一生成的好物体——鸭子:
#3:水平扩展数据集
我们尝试用更多物体来扩大数据集规模,但物体不匹配的问题依然存在。
#4:垂直扩展数据集
只有在我们垂直扩展数据集时,模型性能才真正提升:
- 使用相同数量的物体
- 增加每个物体的示例数量
- 增加用于生成数据集的模型多样性
你可以看到下面的改进:
3、我们犯过的错误
有很多我们尝试过但不起作用的东西,希望这能帮助你避免浪费时间和精力:
- 首先,我们尝试使用AWS Bedrock上的Claude Sonnet和Haiku模型生成数据。根据token数量估算成本为40-60美元。但由于推理token的存在,实际花费了170美元,而输出仅略高于Kimi-K2(非思考模式)和Deepseek-V2等开源模型。
- 其次,我们尝试通过图书馆和字典生成物体名称列表。这是个糟糕的想法,因为列表相当随机,包含基础模型甚至都不了解的物体。
4、训练
准备好数据集后,我们使用以下提示微调Gemma3 1B模型:
'嘿,cadmonkey,给我做一个{物体名称}'
这是使用Unsloth 4位微调完成的。
输出模型被转换为GGUF模型,使用q8量化。
所有内容都在这里:https://hf.co/collections/ThomasTheMaker/cadmonkey
5、让它面向世界!
我使用Modal来托管模型。由于模型很小,即使在CPU、树莓派等上也能很好地运行。
为了速度优化,我在Modal上使用T4 GPU,输出速度非常快。虽然GPU利用率只有8%。
平均每次提示运行成本为2美分。
在这里试用应用:https://cadmonkey.web.app
6、总结
我知道这听起来很老套,但你真的可以做出东西!
5年前,要达到这个目标需要5位数的投资和20名科学家的团队。
现在,我利用来自各种来源的500美元额度,在3个周末内完成了整个实验。
到目前为止,我对语言模型的知识只是一年的自学。
你真的可以做到。你只需要足够疯狂去开始。
原文链接: Train a tiny model to generate 3D files (v2) through example diversification
汇智网翻译整理,转载请标明出处