Tâches Snowflake ML

Utilisez les tâches Snowflake ML pour exécuter des flux de travail de machine learning (ML) dans des environnements d’exécution des conteneurs Snowflake ML. Vous pouvez les exécuter à partir de n’importe quel environnement de développement. Vous n’avez pas besoin d’exécuter le code dans une feuille de calcul ou un notebooks Snowflake. Utilisez les tâches pour tirer parti de l’infrastructure de Snowflake afin d’exécuter des tâches exigeantes en ressources dans le cadre de votre flux de développement. Pour obtenir des informations sur la configuration de Snowflake ML au niveau local, voir Utilisation de Snowflake ML en local.

Important

Les tâches Snowflake ML sont disponibles en avant-première publique dans le paquet Python Snowpark ML (snowflake-ml-python) à partir de la version 1.8.2.

Les tâches Snowflake ML vous permettent d’effectuer les opérations suivantes :

  • Exécuter les charges de travail ML sur les pools de calcul Snowflake, y compris les instances GPU et les instances CPU à mémoire élevée.

  • Utiliser votre environnement de développement préféré, tel que VS Code ou les notebooks Jupyter.

  • Installez et utilisez des paquets Python personnalisés dans votre environnement d’exécution.

  • Utiliser les APIs distribuées de Snowflake pour optimiser le chargement des données, l’entraînement et l’ajustement des hyperparamètres.

  • Intégrez des outils d’orchestration, tels que Apache Airflow.

  • Surveiller et gérer les travaux à l’aide des APIs de Snowflake.

Vous pouvez utiliser ces fonctionnalités pour effectuer les opérations suivantes :

  • Effectuer un entraînement exigeant en ressources sur de grands ensembles de données nécessitant l’accélération de GPU ou d’importantes ressources de calcul.

  • Mettre en production des workflows ML en faisant passer le code ML du développement à la production avec une exécution programmatique par le biais de pipelines.

  • Conserver votre environnement de développement existant tout en exploitant les ressources de calcul de Snowflake.

  • Transformer les workflows OSS ML avec un minimum de modifications du code.

  • Travailler directement avec de grands ensembles de données Snowflake pour réduire les mouvements de données et éviter les transferts de données coûteux.

Conditions préalables

Important

Actuellement, les tâches Snowflake ML ne prennent en charge que les clients Python 3.10. Veuillez contacter l’équipe de votre compte Snowflake si vous avez besoin d’aide pour d’autres versions de Python.

  1. Installez le paquet Python Snowflake ML dans votre environnement Python 3.10.

    pip install snowflake-ml-python>=1.8.2
    
    Copy
  2. La taille par défaut du pool de calcul utilise la famille d’instances CPU_X64_S. Le nombre minimum de nœuds est 1 et le maximum 25. Vous pouvez utiliser la commande SQL suivante pour créer un pool de calcul personnalisé :

    CREATE COMPUTE POOL IF NOT EXISTS MY_COMPUTE_POOL
      MIN_NODES = <MIN_NODES>
      MAX_NODES = <MAX_NODES>
      INSTANCE_FAMILY = <INSTANCE_FAMILY>;
    
    Copy
  3. Les tâches Snowflake ML nécessitent une session Snowpark. Utilisez le code suivant pour la créer :

    from snowflake.snowpark import Session
    from snowflake.ml.jobs import list_jobs
    
    ls = list_jobs() # This will fail! You must create a session first.
    
    # Requires valid ~/.snowflake/config.toml file
    session = Session.builder.getOrCreate()
    
    ls = list_jobs(session=session)
    ls = list_jobs() # Infers created session from context
    
    Copy

    Pour obtenir des informations sur la création d’une session, voir Création d’une session.

Exécuter une tâche Snowflake ML

Vous pouvez exécuter une tâche Snowflake ML de l’une des manières suivantes :

  • Utilisation d’un décorateur distant dans votre code.

  • Soumission de fichiers ou de répertoires entiers à l’aide de l’API Python.

Exécuter une fonction Python en tant que tâche Snowflake ML

Utilisez Function Dispatch pour exécuter des fonctions Python individuelles à distance sur les ressources de calcul de Snowflake avec le décorateur @remote.

À l’aide du décorateur @remote, vous pouvez effectuer les opérations suivantes :

  • Sérialiser la fonction et ses dépendances.

  • La télécharger dans une zone de préparation Snowflake spécifiée.

  • L’exécuter dans Container Runtime pour ML.

L’exemple de code Python suivant utilise le décorateur @remote pour soumettre une tâche Snowflake ML. Notez qu’une Session Snowpark est requise, voir Conditions préalables.

from snowflake.ml.jobs import remote

@remote("MY_COMPUTE_POOL", stage_name="payload_stage", session=session)
def train_model(data_table: str):
  # Provide your ML code here, including imports and function calls
  ...

job = train_model("my_training_data")
Copy

L’appel d’une fonction décorée @remote renvoie un objet MLJob Snowflake qui peut être utilisé pour gérer et surveiller l’exécution de la tâche. Pour plus d’informations, voir Gestion des tâches Snowflake ML.

Exécuter un fichier Python en tant que tâche Snowflake ML

Exécutez des fichiers Python ou des répertoires de projets sur les ressources de calcul Snowflake. Ceci est utile lorsque :

  • Vous avez des projets ML complexes avec de multiples modules et dépendances.

  • Vous souhaitez maintenir une séparation entre le développement local et le code de production.

  • Vous devez exécuter des scripts qui utilisent des arguments de ligne de commande.

  • Vous travaillez avec des projets ML existants qui n’ont pas été spécifiquement conçus pour être exécutés sur le pool de calcul Snowflake.

L’API de la tâche Snowflake propose deux méthodes principales :

  • submit_file() : Pour l’exécution d’un seul fichier Python

  • submit_directory() : Pour l’exécution de répertoires de projets entiers contenant de nombreux fichiers et de nombreuses ressources

Les deux méthodes prennent en charge ce qui suit :

  • La transmission de l’argument de ligne de commande

  • La configuration de la variable d’environnement

  • La spécification de la dépendance personnalisée

  • Gestion des actifs du projet à travers les zones de préparation Snowflake

File Dispatch est particulièrement utile pour mettre en production des workflows ML existants et pour maintenir une séparation claire entre les environnements de développement et d’exécution.

Le code Python suivant soumet un fichier à une tâche Snowflake ML :

from snowflake.ml.jobs import submit_file

# Run a single file
job1 = submit_file(
  "train.py",
  "MY_COMPUTE_POOL",
  stage_name="payload_stage",
  args=["--data-table", "my_training_data"],
  session=session,
)
Copy

Le code Python suivant soumet un répertoire à une tâche Snowflake ML :

from snowflake.ml.jobs import submit_directory

# Run from a directory
job2 = submit_directory(
  "./ml_project/",
  "MY_COMPUTE_POOL",
  entrypoint="train.py",
  stage_name="payload_stage",
  session=session,
)
Copy

La soumission d’un fichier ou d’un répertoire renvoie un objet MLJob Snowflake qui peut être utilisé pour gérer et surveiller l’exécution de la tâche. Pour plus d’informations, voir Gestion des tâches Snowflake ML.

Gestion des tâches Snowflake ML

Lorsque vous soumettez une tâche Snowflake ML, l’API crée un objet MLJob. Vous pouvez l’utiliser pour effectuer les opérations suivantes :

  • Suivre l’avancement de la tâche grâce à des mises à jour de statut

  • Déboguer les problèmes à l’aide de journaux d’exécution détaillés

  • Récupérer le résultat de l’exécution (le cas échéant)

Vous pouvez utiliser l’API get_job() pour récupérer un objet MLJob par son ID. Le code Python suivant montre comment récupérer un objet MLJob :

from snowflake.ml.jobs import MLJob, get_job, list_jobs

# List all jobs
jobs = list_jobs()

# Retrieve an existing job based on ID
job = get_job("<job_id>")  # job is an MLJob instance

# Retrieve status and logs for the retrieved job
print(job.status)  # PENDING, RUNNING, FAILED, DONE
print(job.get_logs())
Copy

Appelez la méthode result de la tâche pour attendre la fin de l’exécution et récupérer le résultat de l’exécution. Si l’exécution échoue, result lève une exception.

result = job.result()
Copy

Gestion des dépendances

L’API de la tâche Snowflake ML exécute des charges utiles dans l’environnement Container Runtime pour ML. L’environnement dispose des paquets Python les plus couramment utilisés pour le machine learning et la science des données. La plupart des cas d’utilisation devraient fonctionner « prêts à l’emploi » sans configuration supplémentaire. Si vous avez besoin de dépendances personnalisées, vous pouvez utiliser pip_requirements pour les installer.

Pour installer des dépendances personnalisées, vous devez activer l’accès au réseau externe à l’aide d’une intégration de l’accès externe. Vous pouvez utiliser l’exemple de commande SQL suivante pour fournir l’accès :

CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION PYPI_EAI
  ALLOWED_NETWORK_RULES = (snowflake.external_access.pypi_rule)
  ENABLED = true;
Copy

Pour plus d’informations sur les intégrations d’accès externe, voir Création et utilisation d’une intégration d’accès externe.

Après avoir fourni un accès au réseau externe, vous pouvez utiliser les paramètres pip_requirements et external_access_integrations pour configurer des dépendances personnalisées. Vous pouvez utiliser des paquets qui ne sont pas disponibles dans l’environnement du Container Runtime. Vous pouvez également spécifier les versions des paquets.

Le code Python suivant montre comment spécifier des dépendances personnalisées au décorateur remote :

@remote(
  "MY_COMPUTE_POOL",
  stage_name="payload_stage",
  pip_requirements=["custom-package"],
  external_access_integrations=["PYPI_EAI"],
  session=session,
)
def my_function():
  # Your code here
Copy

Le code Python suivant montre comment spécifier des dépendances personnalisées pour la méthode submit_file() :

from snowflake.ml.jobs import submit_file

# Can include version specifier to specify version(s)
job = submit_file(
  "/path/to/repo/my_script.py",
  compute_pool,
  stage_name="payload_stage",
  pip_requirements=["custom-package==1.0.*"],
  external_access_integrations=["pypi_eai"],
  session=session,
)
Copy

Flux de paquets privés

Les tâches Snowflake ML prennent également en charge le chargement de paquets à partir de flux privés tels que JFrog Artifactory et Sonatype Nexus Repository. Ces flux sont généralement utilisés pour distribuer des paquets internes et propriétaires, maintenir le contrôle sur les versions des dépendances et assurer la sécurité/conformité.

Pour installer des paquets à partir d’un flux privé, vous devez procéder comme suit :

  1. Créez une règle de réseau pour autoriser l’accès à l’URL du flux privé.

    1. Pour les sources qui utilisent l’authentification de base, vous pouvez simplement créer une règle de réseau.

      CREATE OR REPLACE NETWORK RULE private_feed_nr
      MODE = EGRESS
      TYPE = HOST_PORT
      VALUE_LIST = ('<your-repo>.jfrog.io');
      
      Copy
    2. Pour configurer l’accès à une source à l’aide d’une connectivité privée (c’est-à-dire Private Link), suivez les étapes décrites dans Sortie réseau par connectivité privée.

  2. Créez une intégration de l’accès externe à l’aide de la règle de réseau. Accordez l’autorisation d’utiliser l’EAI au rôle qui soumettra les tâches.

    CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION private_feed_eai
    ALLOWED_NETWORK_RULES = (PRIVATE_FEED_NR)
    ENABLED = true;
    
    GRANT USAGE ON INTEGRATION private_feed_eai TO ROLE <role_name>;
    
    Copy
  3. Indiquez l’URL du flux privé, l’intégration de l’accès externe et le(s) paquet(s) lors de la soumission de la tâche

    # Option 1: Specify private feed URL in pip_requirements
    job = submit_file(
      "/path/to/script.py",
      compute_pool="MY_COMPUTE_POOL",
      stage_name="payload_stage",
      pip_requirements=[
        "--index-url=https://your.private.feed.url",
        "internal-package==1.2.3"
      ],
      external_access_integrations=["PRIVATE_FEED_EAI"]
    )
    
    Copy
    # Option 2: Specify private feed URL by environment variable
    job = submit_directory(
      "/path/to/code/",
      compute_pool="MY_COMPUTE_POOL",
      entrypoint="script.py",
      stage_name="payload_stage",
      pip_requirements=["internal-package==1.2.3"],
      external_access_integrations=["PRIVATE_FEED_EAI"],
      env_vars={'PIP_INDEX_URL': 'https://your.private.feed.url'},
    )
    
    Copy

Si l’URL de votre flux privé contient des informations sensibles telles que des jetons d’authentification, gérez l’URL en créant un secret Snowflake. Utilisez CREATE SECRET pour créer un secret. Configurez les secrets lors de la soumission d’une tâche avec l’argument spec_overrides.

# Create secret for private feed URL with embedded auth token
feed_url = "<your-repo>.jfrog.io/artifactory/api/pypi/test-pypi/simple"
user = "<auth_user>"
token = "<auth_token>"
session.sql(f"""
CREATE SECRET IF NOT EXISTS PRIVATE_FEED_URL_SECRET
 TYPE = GENERIC_STRING
 SECRET_STRING = 'https://{auth_user}:{auth_token}@{feed_url}'
""").collect()

# Prepare service spec override for mounting secret into job execution
spec_overrides = {
 "spec": {
  "containers": [
    {
     "name": "main",  # Primary container name is always "main"
     "secrets": [
      {
        "snowflakeSecret": "PRIVATE_FEED_URL_SECRET",
        "envVarName": "PIP_INDEX_URL",
        "secretKeyRef": "secret_string"
      },
     ],
    }
  ]
 }
}

# Load private feed URL from secret (e.g. if URL includes auth token)
job = submit_file(
  "/path/to/script.py",
  compute_pool="MY_COMPUTE_POOL",
  stage_name="payload_stage",
  pip_requirements=[
    "internal-package==1.2.3"
  ],
  external_access_integrations=["PRIVATE_FEED_EAI"],
  spec_overrides=spec_overrides,
)
Copy

Pour plus d’informations sur container.secrets, voir champ containers.secrets.

Considérations relatives aux clients

Les tâches Snowflake ML s’exécutent sur Snowpark Container Services et sont facturés en fonction de l’utilisation. Pour des informations sur les coûts de calcul, voir Coûts de Snowpark Container Services.

Les charges utiles des tâches sont téléchargées dans la zone de préparation spécifiée avec l’argument stage_name. Pour éviter des frais supplémentaires, vous devez les nettoyer. Pour plus d’informations, voir Comprendre le coût de stockage et Exploration des coûts de stockage pour en savoir plus sur les coûts liés au stockage de la zone de préparation.