Conteneuriser une ia (kubernetes / docker)

Un rapide exemple de conteneurisation d’une IA sous docker et kubernetes … l’ia en question est celle de mon précédent article sur la transformation en webservice d’une IA.

Please accept YouTube cookies to play this video. By accepting you will be accessing content from YouTube, a service provided by an external third party.

YouTube privacy policy

If you accept this notice, your choice will be saved and the page will refresh.

A la base je pensais utiliser une images sous Alpine pour déployer une IA en webservice avec du uwsgi, mais malheureusement du à divers conflit de librairies … j’ai du me rabattre sur du minideb :/.

Niveau docker c’est plutôt simple … le dockerfile est le suivant :

FROM bitnami/minideb:latest

LABEL maintainer "LZR <loupzeur@gmail.com>"
LABEL description "Nginx + uWSGI + Flask based on Minideb and managed by Supervisord"

# Copy python requirements file
COPY requirements.txt /tmp/requirements.txt

RUN apt-get update
RUN apt-get install --yes \
    python3 \
    bash \
    nginx \
    uwsgi \
    uwsgi-plugin-python3 \
    subversion \
    python3-dev python3-pip \
    cython3 \
    ffmpeg espeak \
    supervisor && \
    pip3 install -r /tmp/requirements.txt && \
    rm /etc/nginx/sites-enabled/default && \
    rm -r /root/.cache

# Copy the Nginx global conf
COPY nginx.conf /etc/nginx/
# Copy the Flask Nginx site conf
COPY flask-site-nginx.conf /etc/nginx/sites-enabled/
# Copy the base uWSGI ini file to enable default dynamic uwsgi process number
COPY uwsgi.ini /etc/uwsgi/
# Custom Supervisord config
COPY supervisord.conf /etc/supervisord.conf

# Add demo app
COPY ./app /app
WORKDIR /app
EXPOSE 80
RUN usermod -u 1000 www-data
RUN usermod -G staff www-data
CMD ["/usr/bin/supervisord"]

Le uwsgi.ini doit contenir un lazy-apps=true, sinon, l’ia ne sera jamais préchargé en mémoire et divers bug apparaîtront après plusieurs executions

[uwsgi]
module = main
callable = app
chdir = /app
wsgi-file = main.py
plugin = /usr/lib/uwsgi/plugins/python3

uid = www-data
gid = www-data

socket = /tmp/uwsgi.sock
chown-socket = www-data:www-data
chmod-socket = 664

processes = 2
lazy-apps=true

Concernant le déploiement sous kubernetes … pas grand chose à dire, si ce n’est que j’ai monté le dossier des IA en volume (ça évite d’avoir le modèle en dur dans l’image docker et de consommer de l’espace disque pour rien :/).

apiVersion: apps/v1
kind: Deployment
metadata:
  name: aiws-deployment
  labels:
    app: aiws
spec:
  replicas: 1
  selector:
    matchLabels:
      app: aiws
  template:
    metadata:
      labels:
        app: aiws
    spec:
      containers:
      - name: aiws
        image: aiws
        imagePullPolicy: Never
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /data
          name: ws-volume
      volumes:
      - name: ws-volume
        hostPath:
          path: /mon/dossier/data
          type: Directory

L’application s’appellera AIWS, sont port d’accès est le 80, et le dossier de la machine « /mon/dossier/data » sera monté sur l’image docker sous le path « /data ».

Il suffira ensuite de déployer votre image sur votre instance kubernetes :). N’oublier de précharger les modèles de votre IA (si elles les utilisent bien sûrs).