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.
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).