随着人工智能的发展,许多业务和数据分析可以基于大语言模型(LLM)进行广泛的应用,而数据处理是LLM开发尤为重要的一环,数据质量的好坏直接影响大模型训练、推理的最终效果。相较于昂贵的GPU资源,MaxCompute的海量弹性CPU资源能够成为LLM海量数据处理的资源基础,而MaxFrame分布式计算能力可以帮助您更加高效、便捷地完成LLM数据处理工作。
前提条件
已安装MaxFrame,详情请参见准备工作。
数据准备
本文以开源项目RedPajama在GitHub中的少量(一万+)数据为例,为您介绍如何使用MaxFrame对GitHub代码数据进行清洗和处理。
为便于使用,数据已被提前存放在MaxCompute公开项目BIGDATA_PUBLIC_DATASET下的data_science
Schema中,您可直接进行使用,表名为llm_redpajama_github_demo_data。部分数据如下:
该表包含 repo_name、id、size、content、binary、copies、ref、path、mode、license、language 共 11 列,记录了各 GitHub 仓库中代码文件的名称、内容片段、是否为二进制、拷贝数、分支引用、文件路径、文件权限、许可证及编程语言等元数据。
公开数据集的介绍及使用详情请参见公开数据集概述。
使用MaxFrame对数据进行“版权信息去除”
对原始数据进行分析,若其中含有“Copyright”等版权信息,需要对该类敏感信息进行去除。
例如:repo_name值为“menuka94/cdnjs”时,对应的content字段中含有“Copyright”等版权信息。
-
创建MaxCompute入口类。
import os import time import numpy as np import maxframe.dataframe as md from odps import ODPS from maxframe import new_session # from maxframe.udf import with_resource_libraries from maxframe.config import options from maxframe import config o = ODPS( # 确保 ALIBABA_CLOUD_ACCESS_KEY_ID 环境变量设置为用户 Access Key ID, # ALIBABA_CLOUD_ACCESS_KEY_SECRET 环境变量设置为用户 Access Key Secret, # 不建议直接使用AccessKey ID和 AccessKey Secret字符串。 os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'), os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'), project='your-default-project', endpoint='your-end-point', )参数说明:
-
ALIBABA_CLOUD_ACCESS_KEY_ID:需将该环境变量设置为具备目标MaxCompute项目中待操作对象相关MaxCompute权限的AccessKey ID。您可以进入AccessKey管理页面获取AccessKey ID。
-
ALIBABA_CLOUD_ACCESS_KEY_SECRET:需将该环境变量设置为AccessKey ID对应的AccessKey Secret。
-
your-default-project :使用的MaxCompute项目名称。您可以登录 MaxCompute控制台 ,在左侧导航栏选择 工作区 > 项目管理 ,查看MaxCompute项目名称。
-
your-end-point:目标MaxCompute项目所在地域的Endpoint,可根据网络连接方式自行选择,例如
http://service.cn-chengdu.maxcompute.aliyun.com/api。详情请参见Endpoint。
-
-
引用MaxCompute内置镜像common,其中包含Python环境及本次数据处理所需的regex等第三方包。
config.options.sql.settings = { "odps.session.image": "common" } -
通过UDF构建数据处理逻辑。
def clean_copyright(row): import re pat = re.compile('/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*/') cpat = re.compile('copyright', re.IGNORECASE) text = row['content'] if not text: return row r = pat.search(text) if r: span = r.span() sub = text[span[0]:span[1]] if cpat.search(sub): # cut it text = text[:span[0]] + text[span[1]:] row['content'] = text return row lines = text.split('\n') skip = 0 for k in range(len(lines)): if (lines[k].startswith('//') or lines[k].startswith('#') or lines[k].startswith('--') or not lines[k]): skip = skip + 1 else: break if skip: text = '\n'.join(lines[skip:]) row['content'] = text return row -
创建MaxFrame Session,提交作业至MaxCompute。
def maxframe_job(): s_time = time.time() table_name = 'bigdata_public_dataset.data_science.llm_redpajama_github_demo_data' session = new_session(o) print('session id: ', session.session_id) df = md.read_odps_table(table_name, index_col='id') df = df.apply( clean_copyright, axis=1, # row output_type="dataframe", ) out_table = 'tmp_mf_clean_copyright' md.to_odps_table(df, out_table).execute() session.destroy() maxframe_job()
数据处理结果
查询tmp_mf_clean_copyright表,对之前含有“Copyright”等版权信息的数据进行查看,已去除敏感信息。
SELECT * FROM tmp_mf_clean_copyright;
部分返回结果如下:查询结果包含 id、repo_name、size、content、binary、copies、ref、path、mode、license、language 等列,显示约 10 行来自 cdnjs 相关仓库的记录,content 列为去除版权信息后的代码片段,mode 值均为 33188,license 值均为 mit。
后续操作
MaxCompute已与阿里云人工智能平台PAI成功对接,您可基于PAI Desinger进行更多LLM算子的开发和使用,LLM算子详情请参见组件参考:大模型数据处理。