自动化打包服务

MaxFrame推出了自动化打包服务,简化了Python开发中第三方包的管理。该服务支持在作业开发时声明所需的外部依赖包,在作业运行时,这些包会自动被打包并集成到作业环境中,无需手动上传,从而减少繁琐的打包管理工作。

注意事项

若您通过标准MaxFrame SDK(本地MaxFrame客户端)访问MaxFrame,需确保MaxFrame SDK版本为V0.1.0b5或以上版本。关于访问MaxFrame详情,请参见准备工作

自动化打包服务说明

MaxFrame支持通过with_python_requirements函数调用自动化打包服务,语法示例如下:


def with_python_requirements(
    *requirements: str,
    force_rebuild: bool = False,
    prefer_binary: bool = False,
    pre_release: bool = False,
): ...

上述参数说明:

  • requirements:必填,声明一个或者多个外部依赖包,声明需遵循PIP(Python包安装器)所使用的规范,即PEP-508规范。例如:

  • @with_python_requirements("scikit_learn>1.0", "xgboost>1.0")
  • force_rebuild:可选,自动化打包时若第三方包已存在,是否还重复打包。取值说明:

    • False(默认值):不重复打包,但生成的包将被保存为临时资源,并且每天都会进行清理。

    • True:重复打包,并强制利用PyPI镜像的最新版本资源,并存储为长期资源。

  • prefer_binary:可选,是否优先选择存在二进制wheel的包进行打包。取值说明:

    • False(默认值):不优先选择。

    • True:优先选择存在二进制wheel的包进行打包。

    • 说明

      相当于pip指定--prefer-binary,将优先选择二进制wheel的包进行打包,可能效率较高但不一定能用到最新版本。

  • pre_release:可选,是否允许打包包含alpha/beta阶段的预发布包。

    • False(默认值):不允许。

    • True:允许。

使用示例

自动化打包第三方包的代码示例如下。

from odps import ODPS
from odps.udf import annotate
import os
from odps import ODPS, options
import maxframe.dataframe as md
from maxframe import new_session

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'
)

session = new_session(o)
data = [["abcd"], ["efgh"], ["ijkl"], ["mno"]]
md_df = md.DataFrame(data, columns=["col1"])
# 调用自动化打包服务
from maxframe.udf import with_python_requirements
@with_python_requirements("jieba==0.40 cloudpickle pandas")
def process(row):
        import jieba
        row["col1"] = row["col1"] + "_" + jieba.__version__
        return row
md_result = (
        md_df.apply(
            process,
            axis=1,
            result_type="expand",
            output_type="dataframe",
            dtypes=md_df.dtypes.copy(),
        )
        .execute()
        .fetch()
    )