目录

模型打包成镜像

手工打包

project_dir=platen-switch
darknet_model_name=darknet-model-platen-switch

cd $project_dir
docker run -d --name $darknet_model_name alpine
docker cp model/ $darknet_model_name:/
docker commit -a 'wang-junjian@qq.com' -m 'darknet model [platen-switch recognition]' \
  $darknet_model_name gouchicao/$darknet_model_name:latest
docker rm -v $darknet_model_name

docker push gouchicao/$darknet_model_name:latest

Python 脚本

import docker
import tarfile
import tempfile
import os

def simple_tar(path):
    f = tempfile.NamedTemporaryFile()
    t = tarfile.open(mode='w', fileobj=f)
    abs_path = os.path.abspath(path)
    t.add(abs_path, arcname=os.path.basename(path))
    t.close()
    f.seek(0)
    return f

darknet_model_name='gouchicao/darknet-model-platen-switch:latest'

client = docker.from_env()
container = client.containers.create('alpine')
with simple_tar('model') as test_tar:
    container.put_archive('/', test_tar)

container.commit(darknet_model_name)

container.remove()
client.close()

部署推理服务

Docker

# 创建存储卷
docker run --name darknet-model-platen-switch --volume /model \
    gouchicao/darknet-model-platen-switch:latest

# 部署模型
docker run -it --name=darknet-serving-platen-switch -p 7713:7713 \
    --volumes-from darknet-model-platen-switch \
    gouchicao/darknet-serving:latest

Kubernetes

编写 Pod YAML(darknet-serving-pod.yaml)

apiVersion: v1
kind: Pod
metadata:
  name: darknet-serving
  labels:
    app: darknet-serving
spec:
  initContainers:
  - name: model
    image: gouchicao/darknet-model-platen-switch:latest
    command: ["sh", "-c", "cp /model/* /model-volume"]
    volumeMounts:
    - mountPath: /model-volume
      name: model-volume
  containers:
  - name: darknet-serving
    image: gouchicao/darknet-serving:latest
    ports:
    - containerPort: 7713
    volumeMounts:
    - mountPath: /model
      name: model-volume
  volumes:
  - name: model-volume
    emptyDir: {}

编写 Service YAML(darknet-serving.yaml)

apiVersion: v1
kind: Service
metadata:
  name: darknet-serving
  labels:
    app: darknet-serving
spec:
  ports:
  - name: http
    port: 80
    targetPort: http
  selector:
    app: darknet-serving

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: darknet-serving
  labels:
    app: darknet-serving
spec:
  selector:
    matchLabels:
      app: darknet-serving
  replicas: 1
  template:
    metadata:
      labels:
        app: darknet-serving
    spec:
      initContainers:
      - name: model
        image: gouchicao/darknet-model-platen-switch:latest
        command: ["sh", "-c", "cp /model/* /model-volume"]
        volumeMounts:
        - mountPath: /model-volume
          name: model-volume
      containers:
      - name: darknet-serving
        image: gouchicao/darknet-serving:latest
        command: ["sh", "-c", "python3 darknet_model_server.py -m=rest"]
        ports:
        - name: http
          containerPort: 7713
        volumeMounts:
        - mountPath: /model
          name: model-volume
      volumes:
      - name: model-volume
        emptyDir: {}

参考资料