您好,我最近正在尝试将TLM应用到NVIDIA Jetson AGX Xavier这个嵌入式设备上,并希望通过微调来获得针对该平台的优化模型。
在此过程中遇到了一些困惑,想请教几点小问题。
我的操作与观察:
1、尝试使用Jetson原生任务: 我第一在Jetson设备上,使用 –target=nvidia/jetson-agx-xavier 成功运行了 dump_network_info.py 和 dump_programs.py,生成了Jetson专属的任务信息和原始程序库。
2、生成失败: 接着,我使用这些Jetson原生的任务草图(sketches)作为输入,并尝试用您项目仓库中预训练好的、基于V100的模型(clm_gen_best_v100)来为Jetson生成张量程序。但我发现,模型生成的绝大部分优化方案(states)都被TVM后端判定为无效,如日志所示:
ret array size: 0
Internal error: All states are invalid.
ret array size: 0
Internal error: All states are invalid.
ret array size: 0
Internal error: All states are invalid.
ret array size: 0
Internal error: All states are invalid.
ret array size: 0
Internal error: All states are invalid.
31%|█████████████████████████▎ | 68/220 [22:29<41:20, 16.32s/it]ret array size: 27, 27, 27
31%|█████████████████████████▋ | 69/220 [22:40<37:05, 14.74s/it]
ret array size: 7, 6, 6
ret array size: 6, 6, 6
ret array size: 6, 6, 6
32%|██████████████████████████ | 70/220 [23:00<40:40, 16.27s/it]
ret array size: 28, 27, 27
32%|██████████████████████████▍
出现了许多报错。虽然有极少数成功案例,但总体来看,V100模型无法很好地理解Jetson原生的任务描述。
3、对比实验:
作为对比,我也进行了另一个实验:我使用了为V100生成的任务草图作为输入,用同一个clm_gen_best_v100模型,但将生成目标设为–target=nvidia/jetson-agx-xavier。在这种“跨平台”生成模式下,模型可以顺利地生成大量有效的张量程序。
我的核心困惑:
基于以上观察,我的核心困惑是关于为新硬件(Jetson)收集微调数据的正确方法论:
① “跨平台”生成的数据是否可用于微调?
我在实验3中,通过“V100的任务草图 -> V100的模型 -> 为Jetson生成程序”这一流程,成功获得了大量可以在Jetson上测量的程序。如果我对这些程序在Jetson上进行测量,得到带有真实latency的数据。请问,这批数据可以被用来微调原始的clm_gen_best_v100模型吗? 这是一种合理且被推荐的微调路径吗?还是说,由于它的“问题(草图)”源自V100,所以它对于教会模型理解Jetson原生的任务协助不大?
② 如果必须使用原生数据,应如何“启动”优化流程?
如果方法①不可取,我们必须使用Jetson原生生成的任务数据(如实验1)。但既然V100模型无法有效处理这些原生数据,导致All states are invalid,那么我应该如何**“启动(bootstrap)”**这个数据收集的“鸡生蛋,蛋生鸡”的循环呢?我是否必须从零开始,先为Jetson创建一个全新的词汇表(tokenizer),然后再预训练一个TLM-base模型?还是有更巧妙的“冷启动”方法?
由于手头的卡不多,从TLM-base开始训练,可能会有些费时,所以想请教一下。
再次感谢您的宝贵时间和卓越工作!期待您的解答。
- 最新
- 最热
只看作者可以在Jetson上补点unlabelled数据,不需要测量所以很快,再训练一下我们提供的base模型,使用的数据混合v100和Jetson的base数据(评估下是否需要平衡数据量)。sft也是一样,数据用混合数据。这样就不存在说以在v100上fine tune的模型作为base,由于在v100上fine后的模型,就已经有”偏好“了,可能不能充分地探索Jetson的搜索空间。通过target来区分两个平台,我们的预想是最终的模型在两个平台都可以很好地泛华。
超级感谢您的耐心回答!经过验证,(使用V100任务+V100模型,为Jetson target生成程序),迁移到Jetson的程序的确能够正确运行。反应到程序,就是
接着,我将这批在Jetson上测得的、带有真实latency的数据作为示范数据,对clm_gen_best_v100模型进行了一次SFT。但正如您所预料,也验证了我的一个猜想:由于初期的数据量过少(仅有几十个成功生成的有效方案),新微调出的模型出现了严重的过拟合,在bert_base上的端到端性能反而大幅下降,且性能抖动(标准差)巨大。
虽然还没来得及尝试使用ansor对比实验结果,但目前的这个结果引发了我一个新的、更深层次的思考,希望能听听您的宝贵意见:
我的核心问题是关于如何正确地将您提供的V100模型适配到新硬件上。
我是否可以这样理解:
将您预训练的clm_gen_best_v100模型,不看作一个针对V100的“最终成品”,而是一个已经学习了张量程序优化通用“语法”和“模式”的、强劲的预训练基座(进阶的 TLM-base)?
基于这个思想,我的下一步计划是:
在Jetson上持续地进行“生成-测量”循环来扩展示范数据集,然后用这份不断增大的、纯正的Jetson数据集,对clm_gen_best_v100这个“基座”进行多轮次的、持续的SFT迭代优化。我的期望是,通过这种方式,模型能够逐渐“学会”Jetson的硬件特性,在保留其强劲v100通用知识的同时,也成为一个Jetson平台上的优化器。
请问这个“将V100模型作为通用基座,通过在新硬件上迭代SFT来逐步适配”的思路,是否是符合TLM设计思想的正确路径?
这个思路进一步引出了一个关于模型容量和知识兼容性的问题:
①如果我用上述方法成功训练出一个精通Jetson的模型,它原来对于V100的优化能力是否会下降(即发生“灾难性遗忘”)?
②或者说,TLM的架构的设计,是否能够通过Prompt中的target信息,来有效地区分和调用不同硬件的知识库,从而实现单一模型对多硬件平台的良好兼容?
Hi V-aerus,
从零开始肯定是一个更稳妥的选择。
基于深度学习的算子生成都有跨平台的问题,这是一个难点。我们的另一篇文章 TLP 讨论过跨平台的问题。最近也有一些跨平台的新工作,Cacomp: A Cloud-assisted Collaborative Deep Learning Compiler Framework for DNN Tasks on Edge。
至于你提到的第一种方式,我认为是可以尝试的,或许会有一些新的发现。但有几点可以尽早确认一下:1) 迁移到 Jetson 的程序是否能够正确运行——可以通过比较执行结果来验证;2) 迁移程序与在 Jetson 上原生生成的程序在性能上是否可比,是否有加速空间,可以尝试在 Jetson 上使用 Ansor 进行调优,Ansor 不依赖于跨平台数据。