基于MaxFrame实现大语言模型数据处理

随着人工智能的发展,许多业务和数据分析可以基于大语言模型(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。部分数据如下:

image

公开数据集的介绍及使用详情请参见公开数据集概述

使用MaxFrame对数据进行“版权信息去除”

对原始数据进行分析,若其中含有“Copyright”等版权信息,需要对该类敏感信息进行去除。

例如:repo_name值为“menuka94/cdnjs”时,对应的content字段中含有“Copyright”等版权信息。

image

  1. 创建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

  2. 引用MaxCompute内置镜像common,其中包含Python环境及本次数据处理所需的regex等第三方包。

    config.options.sql.settings = {
        "odps.session.image": "common"
    }
  3. 通过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
  4. 创建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;

部分返回结果如下:image

后续操作

MaxCompute已与阿里云人工智能平台PAI成功对接,您可基于PAI Desinger进行更多LLM算子的开发和使用,LLM算子详情请参见组件参考:大模型数据处理