常见问题 FAQ
兼容性
- 文档里中提到AOP SDK只支持python 3.8~3.10,是否可以用除此之外的版本,如果不能原因是什么?
回答:目前仅支持 python 3.8~3.10。主要AOP框架底层ACE引擎支持新版本有额外开发工作,后续产品规划将支持常见版本。
- 平台支持的浏览器是什么?
回答: 为了确保最佳使用体验,建议您使用以下浏览器访问平台,以获得完整的功能体验和最佳性能表现。
- Google Chrome
- Mozilla Firefox
- Microsoft Edge
众包数据标注
- 发题时报错,错误信息类似于 capData.projectId = str(CROUD_SOURCING_DATA['projectId']) TypeError: 'NoneType' object is not subscriptable" })) })
回答:需要保证以下步骤正确执行:
- 从有灵平台 clone 的项目代码中的 idl 包含最新的众包能力
- 用最新的 idl 生成了代码,例如 python idl.py -gf
- 将项目中的 aop.idl.json 提交到了 git 仓库
- 通过有灵平台发布了含有对应的 human 类型的能力
- 有灵平台上可视化编辑页面,侧边栏 “页面” 中有能力对应的页面
- 发布服务器时同时勾选了 “前端页面”和“后端服务器”
- 如果是主干服务器,在众包平台上完善了任务模板,并审核通过。
- 有灵平台发布日志中显示“发布成功“
SDK 数据查询
- SDK 数据查询:使用 fuxi.aop.runtime.Dataset.fetch 报错 :" Lost connection to MySQL server during query (timed out)')"
回答:查询数据量太大导致超时或者 TiDB 内存不足。
建议:
-
默认每次查询 10000 条数据,可以通过 fetch 的 limit 参数调小每次查询的数据量,建议每次查询的数据量小于 100MB。例如:如果 persist 传入的 input 和 output 数据大小之和为 1MB,那么使用 fetch 查询数据时 offset 参数最大只能设置为 100。
-
数据量很大时,建议用索引 id 或 (agentId, dataId) 或 createTime 查询。
-
每次查询时,记录一下最后那条的 agentId 和 dataId。下一次查询 where 增加 where=['agentId>"{}" or (agentId="{}" and dataId>{})'.format(agentId, agentId,dataId)])。
async def main():
await AOP.init(config=sdk.get_server_config("11035"))
dataset = await Dataset.init(config=sdk.get_server_config("11035"))
table_name = 'excavator_cat_train'
limit = 100
aop_data_num = 0
dataId = 0
agentId = ''
table = await dataset.load(table_name, schema=(CapInput, CapOutput))
while True:
records: List[RecordRef[CapInput, CapOutput]] = await table.fetch(limit=limit,
where=['agentId>"{}" or (agentId="{}" and dataId>{})'.format(agentId, agentId,dataId)])
if not records:
break
agentId = records[-1].traceInfo.agentId
dataId = records[-1].traceInfo.dataId
aop_data_num += len(records)
logger.info(f"current {aop_data_num}, dataId: {dataId}")
- 使用 fuxi.aop.runtime.Dataset.fetch 查询数据时比较慢(速度在 40Mbps 或者 5MB/s 以下)
回答:机房外网络访问限制了带宽,如果需要查询的数据量比较大时可以切换到机房内的机器上执行(例如丹炉上的机器),在内网环境下访问速度会提升到 800Mbps 左右
- 使用 fuxi.aop.runtime.Dataset.fetch 查询数据时,用 createTime 字段作为 order_by 条件,查询结果与实际数据产生的时间顺序不一致
回答:数据库中的 createTime 是数据入库的时间,与调用 persist 的时间并不完全一致,存在两种情况:
- 使用网络回传时,由于云端为分布式架构,为了保证性能,没有保证全局 createTime 的时序性,针对每条数据可能产生不同程度的延迟,当网络环境较差时,可能存在部分数据延迟很大的情况。
- 使用硬盘摆渡时,createTime 为接入点上传数据时产生的时间,与调用 persist 的时间无关。
- 使用 fuxi.aop.runtime.Dataset.fetch 查询数据时,用 createTime 字段作为 where 条件排序查询时间范围内的数据,查询结果与实际数据产生的时间不一致
回答: 数据库中的 createTime 是数据入库的时间,与调用 persist 的时间并不完全一致。sdk 目前没有记录调用 persist 的时间,需要在输入或者输出参数中显式传入。
SDK 数据上传
- 使用 async with 方法打开 Image 对象后上传的数据中没有 _url
回答:
-
如果是在端侧设备上查看数据没有 _url 属于正常情况,端侧在网络不稳定的情况下有概率出现没有 _url 的情况。当数据通过接入点或者网络回传到云端后,会自动补充 _url 字段。
-
如果在数据集中查看数据没有 _url,需要保证 persist 在 async with Image 的上下文中执行:
- 正确方式
async with (await Image.from_mat_async(mat)) as img: await auto.truck_recognition_ai.persist((img,))
- 错误方式
img_to_persist = None async with (await Image.from_mat_async(mat)) as img: some_img_processor(img) img_to_persist = img await auto.truck_recognition_ai.persist((img_to_persist,))
- 出现报错 {"expecting_type": ..., "given_object": ...}
回答:
IDL 中定义的类型与 persist 中传入参数的类型不一致。比较类型时,需要从 IDL 中 Obervation,State, Action, Reward 下一层开始比较,例如:
- IDL 中定义类型:imu: State[List[Vector[float, Size[3 + 4 + 4]]]]
- 调用 persist: excavator_agent.exnextstate.persist((imu,)) 其中 imu 必须为List[Vector[float, Size[11]]] 类型,Vector 的长度也必须是 11
如果 imu 可能为 None,那么 IDL 中需要定义成 State[Optional[List[Vector[float, Size[3 + 4 + 4]]]]] 类型
- 数据上传失败,出现报错 NetworkException: rpc error 和 is not active for 30000ms time
回答:上传数据量过大,可以考虑对数据进行压缩,或者调大带宽。可以在 ./device_config.json 文件中,写入 max_data_upload_bandwidth 配置来修改带宽。例如如果要将带宽设置为 10Mbps,可以写成:
{"max_data_upload_bandwidth": "10Mbps"}
其他问题
- SDK 日志:使用logging.config.fileconfig(xxx.config)对用户应用自身log模块进行配置后,sdk日志不能正常打到终端
回答:
logging.config.fileConfig('test.conf', disable_existing_loggers=False)
使用logging.config模块配置日志时,需要把disable_existing_loggers参数改为False,否则第三方库的日志模块会失效
- 平台调试:目前平台是否支持调试模式?
回答:目前平台仅支持生成代码和自定义代码的调试,即云端objectser的调试。AI能力的推理、训练和评估等调试模式预计在Q2季度提供