La gestion des dépendances Python tierces dans les jobs MaxFrame distribués exige habituellement le téléversement manuel des packages vers MaxCompute avant chaque exécution. Le service de packaging automatique supprime cette étape : déclarez vos dépendances dans le code à l'aide de with_python_requirements et MaxFrame les résout et les empaquette automatiquement au moment de l'exécution.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Une session MaxFrame connectée à MaxCompute
(Si vous utilisez le client MaxFrame local) La version V0.1.0b5 ou ultérieure du SDK MaxFrame. Consultez la rubrique Préparatifs pour obtenir les instructions de configuration.
Fonctionnement
Décorez votre UDF avec
@with_python_requirementsen listant les packages requis par votre fonction.Lors de l'exécution du job, MaxFrame résout les packages listés depuis PyPI et les intègre dans l'environnement du job.
Lors des exécutions suivantes, si le résultat du packaging est déjà mis en cache, MaxFrame ignore le re-packaging.
Le packaging se déclenche lors de la première exécution. Si le cache est vidé (les ressources temporaires sont supprimées quotidiennement lorsque force_rebuild=False ), MaxFrame effectue un nouveau packaging automatiquement lors de la prochaine exécution, ce qui ajoute de la latence.
Déclaration des dépendances avec with_python_requirements
Le décorateur with_python_requirements constitue le point d'entrée du service de packaging automatique.
def with_python_requirements(
*requirements: str,
force_rebuild: bool = False,
prefer_binary: bool = False,
pre_release: bool = False,
): ...
Paramètres
requirements (obligatoire)
Un ou plusieurs spécificateurs de packages de dépendance, conformes à la syntaxe PEP 508 — le même format que celui utilisé par pip.
@with_python_requirements("scikit_learn>1.0", "xgboost>1.0")
force_rebuild (facultatif, valeur par défaut : False)
Contrôle si MaxFrame doit ou non re-empaqueter les dépendances déjà mises en cache.
|
Valeur |
Comportement |
|
|
Ignore le re-packaging si un résultat mis en cache existe. Le package en cache est stocké en tant que ressource temporaire et supprimé quotidiennement. |
|
|
Re-package toujours en utilisant la dernière version de l'image PyPI. Le résultat est stocké en tant que ressource à long terme et n'est pas supprimé automatiquement. |
Pour le développement et les tests itératifs, conservez la valeur par défaut False. Utilisez force_rebuild=True lorsque vous souhaitez forcer une mise à niveau vers la dernière version du package et stocker le résultat en tant que ressource à long terme.
Avec force_rebuild=False , la ressource temporaire est supprimée quotidiennement. Si le cache est vidé entre deux exécutions, MaxFrame effectue un nouveau packaging automatiquement, ce qui ajoute de la latence à la prochaine exécution.
prefer_binary (facultatif, valeur par défaut : False)
Contrôle si MaxFrame privilégie les fichiers wheel binaires préconstruits aux distributions sources.
|
Valeur |
Comportement |
|
|
Aucune préférence ; pip résout la meilleure correspondance de manière normale. |
|
|
Privilégie les wheels binaires, équivalent à passer |
Privilégier les wheels binaires peut accélérer le packaging, mais la version sélectionnée risque de ne pas être la dernière publication.
pre_release (facultatif, valeur par défaut : False)
Contrôle si les versions de packages en pré-publication (alpha ou bêta) sont éligibles au packaging.
|
Valeur |
Comportement |
|
|
Seules les versions stables sont empaquetées. |
|
|
Les versions alpha et bêta sont incluses. |
Exemple
L'exemple suivant utilise with_python_requirements pour injecter jieba, cloudpickle et pandas dans un job DataFrame apply.
import os
import maxframe.dataframe as md
from maxframe import new_session
from maxframe.udf import with_python_requirements
from odps import ODPS
# Initialize the ODPS client.
# Load credentials from environment variables — avoid hardcoding AccessKey ID
# and AccessKey secret in your code.
o = ODPS(
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"])
# Declare dependencies. MaxFrame packages them automatically at runtime.
@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()
)
Remplacez les espaces réservés suivants par vos valeurs réelles :
|
Espace réservé |
Description |
|
|
Nom de votre projet MaxCompute |
|
|
Votre endpoint MaxCompute |
FAQ
Quand le packaging a-t-il lieu ?
Le packaging se déclenche au début de la première exécution du job. Si le résultat du packaging est déjà mis en cache, MaxFrame ignore le re-packaging et le job démarre immédiatement.
Que se passe-t-il si le package mis en cache est supprimé avant ma prochaine exécution ?
Avec force_rebuild=False, le package mis en cache est stocké en tant que ressource temporaire et supprimé quotidiennement. S'il est supprimé avant votre prochaine exécution, MaxFrame effectue un nouveau packaging automatiquement. Cela ajoute de la latence à cette exécution, mais n'entraîne pas l'échec du job.
Comment garantir l'utilisation des dernières versions des packages entre les exécutions ?
Définissez force_rebuild=True. MaxFrame effectue un nouveau packaging en utilisant la dernière version de l'image PyPI et stocke le résultat en tant que ressource à long terme qui n'est pas supprimée automatiquement.