Datawhale | AI+X AI 夏令营2024 Task3 笔记(4)

309 阅读7分钟

#AI夏令营 #Datawhale #夏令营

排查错误

前面遇到一个错误,就是这里

image.png

现在把错误排查出来了,感谢助教,Datawhale 的 Amy 姐还有群里的大佬们的帮助。

问题出在 API 调用上面,我这里微调 Spark Lite 的结果先出来的,我就发布服务后直接用原来的代码了,代码在这里需要修改一下 url,对应 API 版本

import SparkApi
import json
#以下密钥信息从控制台获取
appid = ""     #填写控制台中获取的 APPID 信息
api_secret = ""   #填写控制台中获取的 APISecret 信息
api_key = ""    #填写控制台中获取的 APIKey 信息

#调用微调大模型时,设置为“patch”
domain = "patchv3"

#云端环境的服务地址
Spark_url = "wss://spark-api-n.xf-yun.com/v1.1/chat"  # 微调v1.5环境的地址
# Spark_url = "wss://spark-api-n.xf-yun.com/v3.1/chat"  # 微调v3.0环境的地址


text =[]

# length = 0

def getText(role,content):
    jsoncon = {}
    jsoncon["role"] = role
    jsoncon["content"] = content
    text.append(jsoncon)
    return text

def getlength(text):
    length = 0
    for content in text:
        temp = content["content"]
        leng = len(temp)
        length += leng
    return length

def checklen(text):
    while (getlength(text) > 8000):
        del text[0]
    return text
    


def core_run(text,prompt):
    # print('prompt',prompt)
    text.clear
    Input = prompt
    question = checklen(getText("user",Input))
    SparkApi.answer =""
    # print("星火:",end = "")
    SparkApi.main(appid,api_key,api_secret,Spark_url,domain,question)
    getText("assistant",SparkApi.answer)
    # print(text)
    return text[-1]['content']

text = []
res = core_run(text,'你好吗?')

我觉得这样就行了,而且也没有报错。但是这样不对,我们看官方文档

image.png

好好好,这次改成 patch

#调用微调大模型时,设置为“patch”
domain = "patch"

#云端环境的服务地址
Spark_url = "wss://spark-api-n.xf-yun.com/v1.1/chat"  # 微调v1.5环境的地址
# Spark_url = "wss://spark-api-n.xf-yun.com/v3.1/chat"  # 微调v3.0环境的地址

这样就对了。赶快运行一下,得到的结果是这样的

image.png

这样显然不对,就不要修改 submit_data.append({"infos":data_dict,"index":id+1}) 这里保持原样才是对的。

再运行一下,得到的结果是这样的

image.png

好,再去评分试一下

image.png

又卡住了,这到底是怎么回事?

image.png

眼尖的朋友们发现了吗?标号为 6,index 为 7 的这一条的格式又错了。。。infos 字段的值必须是一个列表,这里直接是一个字典,这样不对。

不行,我们得写一个处理逻辑把这种问题规避掉。

def validate_and_correct_submit_data(submit_data):
    # 确保 submit_data 的长度不超过 55
    submit_data = submit_data[:55]
    
    for item in submit_data:
        # 检查 infos 是否是列表,如果不是则包裹成列表
        if not isinstance(item.get("infos"), list):
            item["infos"] = [item["infos"]]
    
    return submit_data

# 验证并修正 submit_data
corrected_submit_data = validate_and_correct_submit_data(submit_data)

现在是真没问题了,跑个分看看

image.png

数据集不变模型升级再跑分

行吧,真不能贪便宜。不换数据集,我再拿 Spark Pro 微调一个大模型试试。

image.png

训练好之后需要改的地方主要是 SparkApi.py 里面填的 resourceId。APPID、APIKey、APISecret 这三个只要绑定的应用是一个,都是一样的。

然后需要修改的地方还有 domain 和 url

#调用微调大模型时,设置为“patch”
domain = "patchv3"

#云端环境的服务地址
# Spark_url = "wss://spark-api-n.xf-yun.com/v1.1/chat"  # 微调v1.5环境的地址
Spark_url = "wss://spark-api-n.xf-yun.com/v3.1/chat"  # 微调v3.0环境的地址

可能会出现这样的问题

请求错误: 11200, {'header': {'code': 11200, 'message': 'AppIdNoAuthError:(00:05:52.589) `a610921f`SUBID_a610921f_1234`bm3`tokens.total;patch_id.1809027409668681728`125`&`|`tokens.total`_D`#`-1`P`_C`L`5000000`R`5000000`U`[0:0+0]`#`-1`P`_Q`L`2`q`1`P`_CO`b`0`d`1`S`-1``P`&`|`patch_id.1809027409668681728`_C`#`0`N`_U`#`N`_F`Lscr`0`N', 'sid': 'cht000b2557@dx19083a5154c9a4b550', 'status': 2}}

错误码列表

image.png

这样的话可能是比赛免费送的额度用光了,换个应用吧。

但是我在 training.xfyun.cn/modelServic… 这里选在线体验是可以正常调用微调好的 Spark Pro 模型的,就是不知道为什么在 ai studio 的 notebook 环境里不能调用。(埋下伏笔)

之前有个新用户实名认证后领一亿 token 的活动:console.xfyun.cn/sale/buy?wa…

领取的时候可以选择将额度领取到比赛对应的应用里,也可以新创建一个应用,领取到这个新应用里面。我是领取到新的应用里面了。

要继续愉快玩耍,而且之前应用额度已经花光的情况下,只能把前面的服务先下线,然后绑定到这个新的应用上。

屏幕截图 2024-07-06 004233.png

屏幕截图 2024-07-06 010219.png

屏幕截图 2024-07-06 030629.png

之前绑定的都是 基于星火大模型的群聊对话分角色要素提取挑战赛 这个应用,这次换绑到其他有额度的应用就可以了。

换过去了,然后发现没 token 可用???

image.png

就算在页面里的在线体验,也是没法返回结果,真的是没 token 可用。

什么鬼啊,服了。那就只能换回去,还用之前的比赛专属应用了。

这样的话又回到原来的情况了,前面已经排查过现在的 url 还有 domain 都是正确的,其他的东西都是好好的,我只能怀疑是讯飞的服务器觉得我今天使用的 token 太多了,不给这个 ai studio 环境好好响应了。

那我只能再开一个一模一样的环境了,把前面生成出来的测试集放进去,然后推理部分的代码全部重新运行,如果有缺的库没引进,缺的函数没引进,把前面的库导入还有函数定义等等单独放一个 cell 再运行一下。

需要填写的信息就是 SparkApi.py 里填 resourceId,main.ipynb 里填 APPID、APIKey、APISecret。然后配置都不用改。

#调用微调大模型时,设置为“patch”
domain = "patchv3"

#云端环境的服务地址
# Spark_url = "wss://spark-api-n.xf-yun.com/v1.1/chat"  # 微调v1.5环境的地址
Spark_url = "wss://spark-api-n.xf-yun.com/v3.1/chat"  # 微调v3.0环境的地址

image.png

和之前调用 Spark Lite 一样,这里大模型不说话装高手。不过至少证明换个环境使用 API 就不会被风控了,nice。

后面就很常规了,最后的结果里会出现这种一个 infos 里面有多个结果的:

image.png

image.png

emmm 不是很清楚为什么,而且我现在也感觉官方在变相提醒,要求的 infos 字段的值格式是一个列表,可能就是允许一大段群聊对话里提取出好几个角色的要素呢?

明天尝试用别的大模型分析一下这些提取出好几个角色要素的长对话。

总之还是跑了个分,用了 Spark Pro 跑出来的分就是高一些哈!

image.png

番外

分析一下 token 使用情况

为什么我会把比赛给的两百万 token 用到被风控呢?百思不得其解。

首先是模型服务这边:training.xfyun.cn/modelServic…

Spark Lite 的用量

image.png

鼠标悬停到曲线上不给用量具体数字,导出 Excel 看一下

image.png

然后 Spark Pro 的用量是这么多。顺便展示一下,不计入被风控前的用量。

image.png

Excel 里看一下

image.png

现在对推理到底耗不耗 token 有点体会了,等会看到的是 baseline 1 用掉的 token 和 baseline 2 制作数据集还有微调用掉的 token。

在应用控制台里:console.xfyun.cn/services/bm…

Spark Max 直接用光了

image.png

导出 Excel 看一下

image.png

Spark Pro 顺便展示一下,不计入被风控前的用量。然后这边倒是鸡贼的把剩余 token 数显示成无限了,前面还是五百万 token 上限呢?

image.png

导出 Excel 看一下

image.png

Spark Lite 应该是和前面得到的数据一样才对

image.png

导出 Excel 看一下

image.png

比前面要多一点,多的这一丢丢是我在体验页面测试到底能不能用试的。

1048604 + 152357 = 1200961

干到 120 万就可能被风控了,不过我觉得最主要是把 Spark Max 额度干光了才被风控的。

前面我还以为文档里把不同模型的 url 区分开其实是假的(毕竟我配置错了也把 Spark Lite 调用成功了),其实都调用的 Spark Max 模型,不然这个的额度不可能第一个被花光。

但是想一想也不对,训练花的 token 也就是这么多,没毛病。这里就能体会到为什么要分阶段抽取信息要素了,前面制作数据集需要 token,然后微调需要 token,后面推理还是需要 token。直接去做,花的 token 就是 baseline 1 那些,但是效果并不好。如果就像 baseline 1 一样花 token,达到这一次的分数,现在花的这么多可满足不了。