随着人工智能的发展,许多业务和数据分析可以基于大语言模型(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
。部分数据如下:
公开数据集的介绍及使用详情请参见公开数据集概述。
使用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;
部分返回结果如下:
后续操作
MaxCompute已与阿里云人工智能平台PAI成功对接,您可基于PAI Desinger进行更多LLM算子的开发和使用,LLM算子详情请参见组件参考:大模型数据处理。