Nous utilisons la fonctionnalité AWS Sagemaker, apportez votre propre docker, où nous avons un modèle d'inférence écrit en R. Comme je l'ai compris, la tâche de transformation par lots exécute le conteneur de la manière suivante :

docker run image serve

De plus, sur docker, nous avons une logique pour déterminer quelle fonction invoquer :

args <- commandArgs()
if (any(grepl('train', args))) {
    train()}
if (any(grepl('serve', args))) {
    serve()}

Existe-t-il un moyen de remplacer l'appel de conteneur par défaut afin que nous puissions transmettre des paramètres supplémentaires ?

1
datahack 4 sept. 2020 à 15:00

1 réponse

Meilleure réponse

Comme vous l'avez dit, et est indiqué dans le AWS documentation, Sagemaker exécutera votre conteneur avec la commande suivante :

docker run image serve

En émettant cette commande, Sagemaker écrasera tout CMD que vous fournissez dans votre conteneur Dockerfile, vous ne pouvez donc pas utiliser CMD pour fournir des arguments dynamiques à votre programme.

On peut penser à utiliser le Dockerfile ENTRYPOINT pour consommer certaines variables d'environnement, mais la documentation d'AWS dicte qu'il est préférable d'utiliser la forme exec du ENTRYPOINT. Certains pensent comme :

ENTRYPOINT ["/usr/bin/Rscript", "/opt/ml/mars.R", "--no-save"]

Je pense que, par analogie avec le model formation, ils ont besoin de ce type d'exécution de conteneur pour permettre au conteneur de recevoir des signaux de terminaison :

La forme exec de l'instruction ENTRYPOINT démarre l'exécutable directement, et non en tant qu'enfant de /bin/sh. Cela lui permet de recevoir des signaux tels que SIGTERM et SIGKILL des API SageMaker.

Pour permettre l'expansion des variables, nous devons utiliser la forme ENTRYPOINT shell. Imaginer:

ENTRYPOINT ["sh", "-c", "/usr/bin/Rscript", "/opt/ml/mars.R", "--no-save", "$ENV_VAR1"]

Si vous essayez de faire la même chose avec le formulaire exec, les variables fournies seront traitées comme un littéral et ne seront pas substituées à leurs valeurs réelles.

Veuillez consulter la réponse approuvée de ceci question stackoverflow pour une excellente explication de ce sujet.

Mais, une chose que vous pouvez faire est d'obtenir la valeur de ces variables dans votre code R, comme lorsque vous traitez commandArgs :

ENV_VAR1 <- Sys.getenv("ENV_VAR1")

Pour passer des variables d'environnement au conteneur, comme indiqué dans le Documentation AWS, vous pouvez utiliser la CreateModel et CreateTransformJob demandes sur votre conteneur.

Vous devrez probablement inclure dans votre Dockerfile ENV des définitions pour chaque variable d'environnement requise sur votre conteneur, et fournir pour ces définitions des valeurs par défaut avec ARG :

ARG ENV_VAR1_DEFAULT_VALUE=VAL1
ENV_VAR1=$ENV_VAR1_DEFAULT_VALUE
2
jccampanero 10 sept. 2020 à 06:55