Optimisation avancée d'un conteneur Docker pour le service de modèle Granite TimeSeries FlowState R1

Pour déployer un service de modèle Granite TimeSeries FlowState R1 en environnement de production, un simple docker run n'est pas suffisant. Il est essentiel de créer une image Docker efficace, sécurisée et maintenable. Ce guide aborde les techniques d'optimisation du Dockerfile, la réduction de la taille de l'image, l'implémenattion de mesures de sécurité et l'amélioration de l'observabilité.

Objectifs d'optimisation

Un conteneur de production idéal doit :

  • Avoir une taille réduite pour des déploimeents rapides.
  • Exécuter des processus avec un utilisateur non privilégié pour limiter les risques.
  • Inclure des vérifications de santé pour une surveillance automatique.
  • Exploiter les couches de cache pour accélérer les builds.

Écriture d'un Dockerfile optimisé

Version initiale simplifiée

En supposant une application Python avec main.py comme point d'entrée et deps.txt pour les dépendances :

FROM python:3.9
WORKDIR /srv
COPY . .
RUN pip install --no-cache-dir -r deps.txt
CMD ["python", "main.py"]

Cette version manque d'optimisations.

Version avancée avec multi-stage et sécurité

# Étape de construction
FROM python:3.9-slim AS build-env

WORKDIR /build
COPY deps.txt .
RUN pip install --no-cache-dir --prefix=/opt -r deps.txt

# Étape d'exécution
FROM python:3.9-slim

RUN groupadd -r servicegrp && useradd -r -g servicegrp serviceusr

WORKDIR /srv

COPY --from=build-env /opt /opt
COPY --chown=serviceusr:servicegrp . .

ENV PATH=/opt/bin:$PATH
USER serviceusr

EXPOSE 8080

HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD curl -f http://localhost:8080/health || exit 1

CMD ["python", "main.py"]

Améliorations clés :

  • Build multi-étapes : Réduit la taille finale en excluant les outils de construction.
  • Utilisateur non root : serviceusr exécute l'application.
  • Cache optimisé : Les dépendances sont copiées avant le code source pour limiter les reconstructions.
  • Vérification de santé : Surveille le service via un endpoint.

Optimisations spécifiques pour les modèles

Gestion des dépendances système

# Étape de construction
FROM python:3.9-slim AS build-env

WORKDIR /build
COPY deps.txt .
RUN apt-get update && apt-get install -y --no-install-recommends gcc g++ && \
    rm -rf /var/lib/apt/lists/*
RUN pip install --no-cache-dir --prefix=/opt -r deps.txt

# Étape d'exécution
FROM python:3.9-slim

RUN apt-get update && apt-get install -y --no-install-recommends libgomp1 && \
    rm -rf /var/lib/apt/lists/*

RUN groupadd -r servicegrp && useradd -r -g servicegrp serviceusr

WORKDIR /srv

COPY --from=build-env /opt /opt
COPY --chown=serviceusr:servicegrp . .

ENV PATH=/opt/bin:$PATH
USER serviceusr

EXPOSE 8080

HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD curl -f http://localhost:8080/health || exit 1

CMD ["python", "main.py"]

Pour le support GPU, remplacez l'image de base par une variante NVIDIA CUDA compatible.

Optimisation des fichiers de modèle

FROM python:3.9-slim AS runtime

RUN apt-get update && apt-get install -y --no-install-recommends libgomp1 && \
    rm -rf /var/lib/apt/lists/*

RUN groupadd -r servicegrp && useradd -r -g servicegrp serviceusr

WORKDIR /srv

COPY --chown=serviceusr:servicegrp ./models ./models

COPY --from=build-env /opt /opt
COPY --chown=serviceusr:servicegrp . .

ENV PATH=/opt/bin:$PATH
USER serviceusr

EXPOSE 8080

HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD curl -f http://localhost:8080/health || exit 1

CMD ["python", "main.py"]

Copier les fichiers de modèle volumineux et statiques en premier améliore l'efficacité du cache.

Bonnes pratiques de construction

Fichier .dockerignore

**/__pycache__
**/*.pyc
**/.git
**/.venv
**/venv
**/.env
**/*.log
**/data
**/test*
**/.idea
**/.vscode
README.md
Dockerfile
.dockerignore

Cela évite d'envoyer des fichiers inutiles au contexte de build.

Commandes de build et d'exécution

docker build -t granite-ts-service:v1 .
docker run -d -p 9090:8080 --name granite-svc granite-ts-service:v1

Vérification de l'optimisation

docker images granite-ts-service:v1
docker exec granite-svc whoami
docker inspect --format='{{json .State.Health}}' granite-svc

Ces commandes confirment la taille réduite de l'image, l'exécution en tant qu'utilisateur non root et le statut de santé.

Étiquettes: Docker Dockerfile containerization model-serving granite-timeseries

Publié le 28 juin à 19h20