这里写自定义目录标题
-
- [1. 关于containerd打包命令的澄清](#1. 关于containerd打包命令的澄清)
- [2. NFS配置详细攻略](#2. NFS配置详细攻略)
- [3. 完整的镜像打包和部署流程](#3. 完整的镜像打包和部署流程)
- 总结
我来帮您核实和澄清这些问题。让我先检查您系统上的NFS配置情况。
toolName: run_command
status: success
command: kubectl get storageclass undefined
toolName: run_command
status: success
command: kubectl get pvc --all-namespaces undefined
toolName: run_command
status: success
command: kubectl get pods | grep nfs undefined
toolName: run_command
status: success
command: kubectl describe storageclass nfs-storage-dynamic undefined
toolName: run_command
status: success
command: kubectl describe pod nfs-client-provisioner-86d48775fb-6jm6k undefined
现在我来回答您的问题,并提供详细的配置攻略:
1. 关于containerd打包命令的澄清
您说得对,我之前的说明有些混淆了。实际上,containerd本身不直接构建镜像,而是使用以下工具之一:
- nerdctl :兼容Docker CLI的containerd客户端,使用
nerdctl build命令 - buildctl:BuildKit的命令行工具,用于构建镜像
正确的containerd镜像打包流程是:
- 使用
nerdctl build或docker build构建镜像 - 使用
nerdctl save或docker save导出镜像为tar格式 - 使用
ctr images import将镜像导入到containerd
2. NFS配置详细攻略
根据您的系统信息,NFS已经配置好了,具体信息如下:
- NFS服务器地址 :
10.20.49.163(即master节点) - NFS共享路径 :
/data/nfs/model-weight - StorageClass名称 :
nfs-storage-dynamic - Provisioner :
k8s-sigs.io/nfs-subdir-external-provisioner - 回收策略:Delete(删除PVC时会删除对应的NFS目录内容)
NFS配置详情
NFS动态供应器已经在运行,您无需重新配置。它的工作原理是:
- 当您创建PVC时,NFS供应器会在NFS服务器的
/data/nfs/model-weight目录下自动创建子目录 - 子目录命名格式为
default-<pvc-name>或<namespace>-<pvc-name> - 这些子目录会被挂载到Pod中使用
NFS使用方法
您只需要创建PVC,指定使用 nfs-storage-dynamic StorageClass,系统会自动处理底层的NFS挂载:
yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: dnabert2-dataset-pvc
spec:
accessModes:
- ReadWriteMany
storageClassName: nfs-storage-dynamic # 指定这个StorageClass
resources:
requests:
storage: 100Gi # 您可以根据需要调整大小
3. 完整的镜像打包和部署流程
步骤1:创建必要的PVC
首先,为您的微调任务创建三个PVC:
dataset-pvc.yaml:
yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: dnabert2-dataset-pvc
spec:
accessModes:
- ReadWriteMany
storageClassName: nfs-storage-dynamic
resources:
requests:
storage: 50Gi
model-pvc.yaml:
yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: dnabert2-model-pvc
spec:
accessModes:
- ReadWriteMany
storageClassName: nfs-storage-dynamic
resources:
requests:
storage: 100Gi
output-pvc.yaml:
yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: dnabert2-output-pvc
spec:
accessModes:
- ReadWriteMany
storageClassName: nfs-storage-dynamic
resources:
requests:
storage: 50Gi
应用这些PVC:
bash
kubectl apply -f dataset-pvc.yaml
kubectl apply -f model-pvc.yaml
kubectl apply -f output-pvc.yaml
步骤2:准备Dockerfile
Dockerfile:
dockerfile
FROM pytorch/pytorch:2.0.1-cuda11.7-cudnn8-devel
# 设置环境变量
ENV CUDA_VISIBLE_DEVICES=0
ENV PYTHONPATH=/app:$PYTHONPATH
# 安装依赖
RUN apt-get update && apt-get install -y git wget vim && rm -rf /var/lib/apt/lists/*
# 创建应用目录
WORKDIR /app
# 复制代码文件
COPY src/run_cli.py /app/
# 安装Python依赖
RUN pip install transformers datasets peft accelerate scikit-learn pandas numpy
# 设置入口点
ENTRYPOINT ["python", "run_cli.py"]
步骤3:构建并导入镜像到containerd
bash
# 使用nerdctl构建镜像
nerdctl build -t dnabert2-finetune:latest .
# 导出镜像为tar格式
nerdctl save dnabert2-finetune:latest -o dnabert2-finetune.tar
# 导入到containerd
ctr images import dnabert2-finetune.tar
步骤4:准备数据和模型
将您的数据集复制到NFS挂载点(在master节点上):
bash
# 在master节点上执行
mkdir -p /data/nfs/model-weight/datasets
cp /path/to/your/train.csv /data/nfs/model-weight/datasets/
cp /path/to/your/dev.csv /data/nfs/model-weight/datasets/
cp /path/to/your/test.csv /data/nfs/model-weight/datasets/
# 将模型复制到NFS挂载点
mkdir -p /data/nfs/model-weight/models
cp -r /path/to/your/model/files /data/nfs/model-weight/models/
步骤5:创建并部署训练任务
finetune-job.yaml:
yaml
apiVersion: v1
kind: Pod
metadata:
name: dnabert2-finetune-job
spec:
containers:
- name: finetune-container
image: dnabert2-finetune:latest
imagePullPolicy: IfNotPresent
command: ["python", "run_cli.py"]
args:
- "--model_name"
- "/models" # 模型挂载路径
- "--peft_type"
- "lora"
- "--file_train"
- "/data/train.csv" # 数据集挂载路径
- "--file_dev"
- "/data/dev.csv"
- "--file_test"
- "/data/test.csv"
- "--batch_size"
- "16"
- "--epochs"
- "3"
- "--lr"
- "0.001"
- "--r_val"
- "8"
- "--alpha_val"
- "32"
- "--dropout_val"
- "0.05"
volumeMounts:
- name: dataset-volume
mountPath: /data # 挂载数据集
- name: model-volume
mountPath: /models # 挂载模型
- name: output-volume
mountPath: /app/cli_output # 挂载输出目录
volumes:
- name: dataset-volume
persistentVolumeClaim:
claimName: dnabert2-dataset-pvc
- name: model-volume
persistentVolumeClaim:
claimName: dnabert2-model-pvc
- name: output-volume
persistentVolumeClaim:
claimName: dnabert2-output-pvc
restartPolicy: Never
部署任务:
bash
kubectl apply -f finetune-job.yaml
步骤6:监控和管理
bash
# 查看Pod状态
kubectl get pods | grep dnabert2
# 查看日志
kubectl logs -f dnabert2-finetune-job
# 查看PVC状态
kubectl get pvc | grep dnabert2
总结
- 关于containerd打包:您是对的,containerd本身不构建镜像,而是使用nerdctl或Docker构建后再导入
- 关于NFS配置:NFS已经配置好了,您只需创建PVC并指定StorageClass即可使用
- 关于路径配置:不需要在Dockerfile中配置NFS路径,而是在Pod的YAML文件中定义volumeMounts来映射NFS卷到容器内的特定路径
这个方案完全符合您的要求,数据集、模型权重和输出结果都通过NFS挂载在容器外部,便于管理和复用。