环境简介

TestAgent:https://mp.weixin.qq.com/s/4YJf2OmXZCa3H8oGdULWWA

如果你需要用到部署,可以先看模型的环境依赖,因为会用到 pytorch 然后在看https://modelscope.cn的文档。

建议还是用 GPU 来训练,CPU 需要修改下 demo 那边的.to("cuda")

配置pyconda来做管理 ,一定要用虚拟环境,指定版本 Python3.8。说是大于 3.8,实际上 3.10 版本以上会有问题,一些库有依赖的问题。
模型那边可以按照这个来安装,modelscope 和 github 不一样,不能下载压缩包。我没用 git 的方式,因为你最终要载入模型,还是要用到
pypip3 install modelscope transformers accelerate sentencepiece protobuf

可能会存在需要解决下以下依赖
pypyppeteer 1.0.2 requires websockets<11.0,>=10.0
ultralytics 8.0.158 requires opencv-python>=4.6.0


PS:如果你本地是用 opencv-python-headless 的才需要解决,正常情况下 headless 是主流因为无 GUI

from modelscope import snapshot_download
model_dir = snapshot_download('codefuse-ai/TestGPT-7B',cache_dir="指定你的模型缓存绝对路径",revision = 'v1.0.0')
print(f"model_dir={model_dir}") # 打印出来下载模型的位置

revision 就是看模型版本的 tag。模型比较大,需要用到 cache_dir,落地生产还会需要模型映射的,另外如果做线上不要直接下,用离线。

方案:挂载盘,13GB 预先下载下来,用 rsync 在服务内部离线拷贝过来。

服用方式

目前评估批量执行生成还是比较有价值的。

官方是发布到了 Gradio 上面有案例,自己开发需要做批量的任务。

安装环境:pypip3 install gradio_client,以下为示例代码:

from gradio_client import Client

client = Client("https://www.modelscope.cn/api/v1/studio/codefuse-ai/TestGPT-7B-demo/gradio/")
result = client.predict(
    """为以下Python代码生成单元测试\n
def timestamp_to_datatime(stamp: int or float or str):
    if isinstance(stamp, str):
        stamp = float(stamp)
    return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(stamp))        
""", 512,fn_index=0)
print(result)

然后把不同任务反馈的字符串 result 转成对应语言的文件,打包下载。

可以用 mongo 来存储结论,这里就不给设计了。

返回的内容可以定义一个数据结构,自己做更精细的模型。因为蚂蚁这个 7B 的要后面自己训练和优化,硬件成本还是很大的。

评估下模型的情况 (Python)

Python 整体在三门语言里面是中位的。
这里评估只列出一部分吧,实际自己做评估需要用多套代码,可以通过这个自己做一个参考。

prompt = """为以下Python代码生成单元测试\n
def timestamp_to_datatime(stamp: int or float or str):
    if isinstance(stamp, str):
        stamp = float(stamp)
    return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(stamp))"""
    print(f"prompt代码嵌套层数:{nest_count(prompt)}")
    print(f"prompt代码路径计算:{paths_count(prompt)}")

prompt 代码嵌套层数:2,prompt 代码路径计算:1。
本次代码衡量分是 1.5,测试训练结果是按照 cuda GPU 训练的。中等代码衡量分 3-5 分。

检查项 结论 测试描述
提示词里面支持替换其他单测框架 不支持 有神经网络分词的库所以是可以命中分词的。添加 pytest 和 unittest 的一些官方名词无效,生成代码只是 unittest 基础类
模型反馈工程能力 维护成本高 1.单测不会生成可传递参数化 (统一管理,也是平台开发时的关键之一) 2.会生成 doc,但是在断言方法里面 self.assertEqual 没有传递 doc。(影响较大,断言后的 message 是做为回显反馈) 3.没有生成类级别初始化执行器和回收器,对于不熟悉的人来说提供不了语言提升的能力,而且生成也很简单。 4.支持 unittest,但是方法命名没有走 unittest 标准,会导致乱序,不可包含上下文。(影响较大,需要用户自己去调整)
assert 补全 会补全,但是不可直接用 1.非法断言用法错误,无效执行是通过的。def test_invalid_timestamp(self): # 测试非法时间戳转换 stamp ="invalid_timestamp"with self.assertRaises(ValueError): timestamp_to_datatime(stamp)
数据转换能力 不通过 1.时间戳转换数据错误。比如上面的 1624060800 时间戳不等于'2021-06-28 00:00:00',意味着 self.assertEqual 结论一定错误。
验证可迭代对象 不通过 1/3 正确 修改提示词 timestamp_to_datatime(stamp: tuple or dict or list),只有 List 正确。元组和字典传递的参数不是多个对象是 stamp = (2021, 1, 1, 0, 0, 0),stamp = {"year": 2021, "month": 1, "day": 1, "hour": 0, "minute": 0, "second": 0}。然后直接 assert timestamp_to_datatime(stamp) == "2021-01-01 00:00:00",捂脸

PS:表格里面好像代码格式无法格式化,这里只能麻烦看官自己处理下啦。

建议

在这些检查项上面还可以测试下是否支持验证递归和一些自定义的数据结构,用例和参数是否有效。
上面用的面向过程方法级别去做的测试,可以用类级别的代码片段去做尝试后,添加一些检查项,再做决定。
通常标准是通过项比较多并且重要的都有,还是推荐用的。
而通过少,维护成本高和还得一个个检查的话,还是等成熟迭代后在用,这块主要还是依赖了 7B 大模型的迭代。

最终结论

做模型可都不容易啊,可以等继续完善点再次使用。
比如丰富了支持主流的 pytest 和一些 UT 的插件。Golang 语言的支持。


↙↙↙阅读原文可查看相关链接,并与作者交流