You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS SageMaker批量转换遇Unicode编码错误,求根因与解决方法

解决AWS SageMaker Linear Learner批量转换时的UnicodeEncodeError错误

从你提供的CloudWatch日志和代码细节来看,这个问题的核心是数据中存在非ASCII字符,而SageMaker批量转换任务在处理时默认采用ASCII编码,导致无法解析这些字符。另外还有一个潜在问题:你上传的数据格式和指定的content_type不匹配,这进一步加剧了编码错误的触发。

根本原因拆解

  1. 编码规则冲突:你的批量转换请求指定了content_type='text/csv',但Linear Learner处理CSV数据时默认用ASCII编码。如果测试数据(比如strat_test_set里的字符串列)包含中文、特殊符号等非ASCII字符,就会直接触发UnicodeEncodeError。
  2. 数据格式不匹配:你用smac.write_numpy_to_dense_tensor生成的是SageMaker专用的二进制张量格式(基于Protobuf),但却告诉服务这是CSV文本。这种格式错位会让服务尝试用文本编码规则解析二进制数据,进而抛出编码异常。

具体解决方法

方案1:修正content_type匹配二进制数据格式

这是最简单的解决方案——既然你已经用SageMaker工具生成了兼容的二进制张量数据,只需要让服务正确识别格式即可,彻底绕开文本编码问题:

transformer.transform(
    data=batch_input, 
    data_type='S3Prefix', 
    content_type='application/x-recordio-protobuf', 
    split_type='Line'
)

方案2:处理非ASCII字符并使用UTF-8编码的CSV

如果你确实需要用CSV格式进行批量转换,需要先清理数据并指定正确的编码:

  1. 清理/转码非ASCII字符:如果非ASCII字符是无效数据,可以直接移除;如果是有效数据,转码为UTF-8保留:
# 假设strat_test_set是pandas DataFrame,处理所有字符串列
for col in strat_test_set.select_dtypes(include=['object']).columns:
    # 移除非ASCII字符,如需保留可改用str.encode('utf-8')
    strat_test_set[col] = strat_test_set[col].str.encode('ascii', 'ignore').str.decode('ascii')
  1. 用UTF-8编码上传CSV:放弃二进制张量的上传方式,直接保存为UTF-8编码的CSV文件:
# 将预处理后的数据保存为UTF-8编码的CSV
housing_test_inputs.to_csv('test_batch_data.csv', index=False, encoding='utf-8')
# 上传到S3指定位置
s3 = boto3.resource('s3')
s3.Bucket(bucket).Object(os.path.join(prefix, 'test', 'test_batch_data.csv')).upload_file('test_batch_data.csv')
# 转换时指定content_type为UTF-8编码的CSV
transformer.transform(
    data=batch_input, 
    data_type='S3Prefix', 
    content_type='text/csv; charset=utf-8', 
    split_type='Line'
)

方案3:检查预处理流程

回头排查你的full_pipeline预处理逻辑,确认是否在特征工程阶段引入了非ASCII字符,或者有没有统一将字符串编码为UTF-8。提前在预处理阶段处理编码问题,能避免后续批量转换时的麻烦。

快速验证方法

先确认数据里确实存在非ASCII字符,运行这段代码检查:

# 检查DataFrame中所有字符串列是否包含非ASCII字符
for col in strat_test_set.select_dtypes(include=['object']).columns:
    has_non_ascii = strat_test_set[col].str.contains(r'[^\x00-\x7F]').any()
    print(f"列 {col} 包含非ASCII字符: {has_non_ascii}")

根据检查结果选择对应的方案即可。

内容的提问来源于stack exchange,提问作者Sarth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:21:11