MaxFrame AI Function est une solution de bout en bout pour l'inférence hors ligne de grands modèles de langage (LLM) dans MaxCompute. Elle associe le traitement des données aux capacités d'IA et vous permet d'exécuter l'inférence LLM par lots directement sur les ressources de quota GPU (GU), sans quitter votre flux de travail d'entrepôt de données.
Cette rubrique explique comment appeler un LLM géré à l'aide de llm.generate sur des ressources GU.
Démarrage rapide
L'extrait de code suivant présente l'appel minimal de bout en bout. Consultez les sections ci-dessous pour obtenir des détails sur les paramètres et des conseils de débogage.
import os
import maxframe.dataframe as md
from maxframe import new_session
from maxframe.config import options
from maxframe.learn.contrib.llm.models.managed import ManagedTextGenLLM
from odps import ODPS
# Initialize session
o = ODPS(
os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
project='<your project>',
endpoint='https://service.cn-<your region>.maxcompute.aliyun.com/api',
)
session = new_session(o)
options.session.gu_quota_name = "<your GU quota name>" # Required to route tasks to GPU workers.
# Prepare input data
df = md.DataFrame({"query": ["What is the boiling point of water?"]})
# Initialize the managed LLM client
llm = ManagedTextGenLLM(name="Qwen3-4B-Instruct-2507-FP8") # Name must be an exact match.
# Define the prompt template and run inference
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Please answer the following question: {query}"},
]
result_df = llm.generate(df, prompt_template=messages)
result_df.execute()
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Kit de développement logiciel (SDK) MaxFrame version 2.3.0 ou ultérieure
Python 3.11
Un quota GU activé pour votre projet MaxCompute. Pour plus d'informations, consultez la section Achat et utilisation des ressources de calcul IA MaxCompute
Au moins des autorisations de lecture et d'écriture au niveau du projet pour MaxCompute
Configurer l'environnement
Le code suivant initialise une session MaxFrame et lui attribue un quota GU. Toutes les tâches LLM suivantes s'exécutent dans cette session.
import os
import maxframe.dataframe as md
import numpy as np
from maxframe import new_session
from maxframe.config import options
from maxframe.udf import with_running_options # Helper for attaching resource options to UDF-based tasks.
from odps import ODPS
import logging
# Route tasks to the DPE and MCSQL engines; disable SPE for GPU workloads.
options.dag.settings = {
"engine_order": ["DPE", "MCSQL"],
"unavailable_engines": ["SPE"],
}
logging.basicConfig(level=logging.INFO)
# Initialize the MaxFrame session with your project credentials.
o = ODPS(
# Make sure the ALIBABA_CLOUD_ACCESS_KEY_ID environment variable is set to your AccessKey ID,
# and the ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variable is set to your AccessKey secret.
# Do not use the AccessKey ID and AccessKey secret strings directly.
os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
project='<your project>',
endpoint='https://service.cn-<your region>.maxcompute.aliyun.com/api',
)
session = new_session(o)
options.session.gu_quota_name = "xxxxx" # Replace with your GU quota name.
print("LogView address:", session.get_logview_address())
Le paramètre gu_quota_name est requis pour utiliser les ressources GU. Sans ce paramètre, les tâches d'inférence ne sont pas distribuées aux workers GPU.
Appeler un LLM géré
Les quatre étapes ci-dessous utilisent llm.generate pour soumettre une tâche d'inférence asynchrone à un modèle géré.
Étape 1 : Préparer les données d'entrée
import pandas as pd
from IPython.display import HTML
# Set display options for debugging.
pd.set_option("display.max_colwidth", None)
pd.set_option("display.max_columns", None)
HTML("<style>div.output_area pre {white-space: pre-wrap;}</style>")
# Create a query list.
query_list = [
"What is the average distance between the Earth and the Sun?",
"In what year did the American Revolutionary War begin?",
"What is the boiling point of water?",
"How can I quickly relieve a headache?",
"Who is the main character in the Harry Potter series?",
]
# Convert to a MaxFrame DataFrame.
df = md.DataFrame({"query": query_list})
df.execute()
Étape 2 : Initialiser l'instance LLM
ManagedTextGenLLM est le client destiné aux modèles de génération de texte gérés hébergés sur MaxCompute. Indiquez le nom exact du modèle pour identifier celui à utiliser.
from maxframe.learn.contrib.llm.models.managed import ManagedTextGenLLM
llm = ManagedTextGenLLM(
name="Qwen3-4B-Instruct-2507-FP8" # The model name must be an exact match.
)
Une faute de frappe ou une incompatibilité de version dans le nom du modèle entraîne l'échec de la tâche. Pour la liste complète des modèles pris en charge, consultez la section Modèles pris en charge pour MaxFrame AI Function.
Étape 3 : Définir le modèle d'invite
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Please answer the following question: {query}"},
]
Syntaxe du modèle :
Utilisez
{column_name}comme espace réservé. Il est automatiquement remplacé par la valeur de la colonne DataFrame correspondante au moment de l'exécution.Transmettez une liste
messagespour prendre en charge les conversations multi-tours.Utilisez le rôle
systempour définir le comportement du modèle.
Étape 4 : Exécuter la tâche de génération
result_df = llm.generate(
df, # Input DataFrame
prompt_template=messages,
running_options={
"max_tokens": 4096, # Maximum output length
"verbose": True # Enable verbose log output
},
params={"temperature": 0.7},
)
# Execute and get the result.
result_df.execute()
Schéma de sortie
result_df est un DataFrame MaxFrame contenant les champs suivants :
|
Champ |
Type |
Description |
|
|
string |
Entrée d'origine |
|
|
string |
Réponse générée par le modèle |
|
|
string |
Raison de l'achèvement : |
|
|
int |
Nombre de jetons d'entrée |
|
|
int |
Nombre de jetons de sortie |
|
|
int |
Nombre total de jetons |
Performances et débogage
Optimisation des performances
|
Optimisation |
Recommandation |
|
Taille du lot |
Limitez chaque lot à moins de 100 éléments pour éviter les erreurs de dépassement de mémoire (OOM) |
|
Allocation GU |
|
|
Degré de parallélisme |
MaxFrame planifie automatiquement les travaux concurrents. Contrôlez ce paramètre avec |
|
Mise en cache des résultats intermédiaires |
Utilisez |
|
Délai d'expiration |
Ajoutez |
Conseils de débogage
Afficher les journaux d'exécution
print(session.get_logview_address()) # Click the link to view real-time MaxFrame job logs.
Exécuter un test à petite échelle avant l'exécution complète
df_sample = df.head(2) # Use two rows for testing.
result_sample = llm.generate(df_sample, prompt_template=messages, running_options={"gu": 2})
result_sample.execute()
Vérifier l'utilisation des ressources
Consultez l'état d'exécution détaillé des travaux dans MaxFrame Logview.