# model_train_and_deploy **Repository Path**: LingJianCode/model_train_and_deploy ## Basic Information - **Project Name**: model_train_and_deploy - **Description**: 本次作业分为三个任务,旨在综合应用 Python 的机器学习工具、容器化技术以及 Kubernetes 集群操作技能: 1. 模型训练:使用 MNIST 数据集训练一个机器学习模型。 2. 容器化部署:将模型的推理服务封装为 Docker 容器。 3. Kubernetes 单机部署:搭建一个简单的 Kubernetes 集群,实现图片分类的分布式推理。 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2025-03-26 - **Last Updated**: 2025-04-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 任务说明 ## 简介 本次作业分为三个任务,旨在综合应用 Python 的机器学习工具、容器化技术以及 Kubernetes 集群操作技能。任务的目标是: 1. **模型训练**:使用 MNIST 数据集训练一个机器学习模型。 2. **容器化部署**:将模型的推理服务封装为 Docker 容器。 3. **Kubernetes 单机部署**:搭建一个简单的 Kubernetes 集群,实现图片分类的分布式推理。 具体任务请点击[任务](./mission.md)。 # 文件说明 - `model_Mnist_optimal.pth`: 使用`simple-cnn-mnist.ipynb`在Kaggle平台训练的模型 - `train.parquet`:从Hugging Face平台下载的[MNIST数据集](https://huggingface.co/datasets/ylecun/mnist) - `client.py`: 从数据集中读取一张图片提交给master - `master.py`: 1. worker节点注册; 2. 将从client接受的图片数据发送给worker,然后将worker处理结果发送给client - `worker.py`:接受master节点发送的数据,经过处理后(升维,并转换成Tensor)输入进模型进行分类,将分类结果发送给master。 - `simple-cnn-mnist.ipynb`: 使用简单的CNN模型在MNIST数据集上训练,保存训练后的模型。 - `model_load_test.py`:测试训练后的模型加载使用 # 模型训练 使用pytorch框架搭建的简单CNN模型进行训练,将准确度最高的模型保存下来`model_Mnist_optimal.pth`。具体细节见[simple-cnn-mnist.ipynb](./simple-cnn-mnist.ipynb). ![train](./img/model_nn.png) ![train](./img/model_train.png) # Docker ```shell docker build -t master:0.2 -f Dockerfile-master . docker build -t worker:0.2 -f Dockerfile-worker . ``` ![master](img/build_master.png) ![master](img/build_worker.png) ```shell docker run -e PYTHONUNBUFFERED=1 -p 8888:8888 master:0.2 ``` ## worker容器排错 ```shell # 运行master docker run -e PYTHONUNBUFFERED=1 -p 8888:8888 -v ./:/opt/app master:0.2 # 使用--entrypoint /bin/sh覆盖Dockerfile中entrypoint docker run -it --entrypoint /bin/sh -v ./:/opt/app worker:0.2 # 运行worker python worker.py 192.168.110.136 8888 # client提交数据 python client.py 192.168.110.136 8888 ``` ### master运行日志 ![client](./img/docker_run_master_res.png) ### worker运行日志 ![client](./img/docker_run_worker_res.png) ### client运行日志 ![client](./img/docker_run_client_res.png) # docker compose 使用docker compose搭建,具体请见[docker-compose.yaml](docker-compose.yaml) ![master](img/docker_compose_env.png) # k3s环境搭建 [快速入门指南 | K3s](https://docs.k3s.io/zh/quick-start) ```shell # 查看状态 kubectl cluster-info ``` ![k3s_agent_install](./img/k3s_agent_install.png) # 项目部署测试 ```shell kubectl create ns code_test kubectl apply -f xxx.yaml -n code_test ``` ## YAML ### master deployment 只能一个pod,多pod有问题 [master.yaml](./k8s/yaml/master.yaml) ### master internal service ```yaml apiVersion: v1 kind: Service metadata: name: master spec: selector: app: master ports: - protocol: TCP port: 8888 targetPort: 8888 ``` ### master external service ```yaml apiVersion: v1 kind: Service metadata: name: master spec: type: NodePort selector: app: master ports: - protocol: TCP port: 8888 targetPort: 8888 nodePort: 30007 ``` ### worker deployment [worker.yaml](./k8s/yaml/worker.yaml) ### 部署测试 ```shell kubectl create ns model kubectl apply -f master.yaml -n model kubectl apply -f worker.yaml -n model ``` ![master_deploy_on_k3s](./img/master_deploy_on_k3s.png) ![master_log_on_k3s](./img/master_log_on_k3s.png) ![worker_deploy_and_log_on_k3s](./img/worker_deploy_and_log_on_k3s.png) ![client_k3s_test](./img/client_k3s_test.png) ## HELM ```shell helm install model_server ./k8s/helm ``` # GPU > NVIDIA驱动 > > CUDA驱动 > > nvidia-container-runtime TODO # 图片尺寸问题 该项目代码要求的图片尺寸为28x28,如果提交其他尺寸的图片则会出现问题,需要在`client.py`中提前对图片进行处理。在客户端处理而不是服务端处理的好处: 1. 减少数据传递,降低了服务端的流量; 2. 利用客户端计算的能力,减少了服务端的计算量。