containerd打包命令 和NFS挂载

这里写自定义目录标题

我来帮您核实和澄清这些问题。让我先检查您系统上的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镜像打包流程是:

  1. 使用 nerdctl build 或 docker build 构建镜像
  2. 使用 nerdctl save 或 docker save 导出镜像为tar格式
  3. 使用 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动态供应器已经在运行,您无需重新配置。它的工作原理是:

  1. 当您创建PVC时,NFS供应器会在NFS服务器的 /data/nfs/model-weight 目录下自动创建子目录
  2. 子目录命名格式为 default-<pvc-name> 或 <namespace>-<pvc-name>
  3. 这些子目录会被挂载到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

总结

  1. 关于containerd打包:您是对的,containerd本身不构建镜像,而是使用nerdctl或Docker构建后再导入
  2. 关于NFS配置:NFS已经配置好了,您只需创建PVC并指定StorageClass即可使用
  3. 关于路径配置:不需要在Dockerfile中配置NFS路径,而是在Pod的YAML文件中定义volumeMounts来映射NFS卷到容器内的特定路径

这个方案完全符合您的要求,数据集、模型权重和输出结果都通过NFS挂载在容器外部,便于管理和复用。

相关推荐
用户3721574261354 小时前
Java 操作 PPT 超链接:添加、修改和删除
java
学Linux的语莫5 小时前
python中类的常见写法
开发语言·python·状态模式
需要8265 小时前
容器化 Java:镜像瘦身与 JVM 容器感知(cgroup)
java·开发语言·jvm
Thomas.Sir5 小时前
第2课:SpringBoot4.x 项目构建:Maven/Gradle配置详解,父工程与依赖管理
java·spring boot
dyxal5 小时前
A2A 协议 v1.0 完全指南:方法名、Agent Card、三种绑定与 FastAPI 实战
开发语言·qt·fastapi
譕痕5 小时前
Rabbit 实例
java·开发语言·java-rabbitmq
weixin_448771725 小时前
使用Aspose给PDF添加水印
java·pdf
\光辉岁月/5 小时前
7.system类
java·system类
综合简报5 小时前
黑五海外发稿投给谁?三类海外媒体发稿渠道的分工
开发语言·php·媒体
SL_staff6 小时前
BI落地失败的3个技术断点:从数据接入、自助分析到服务闭环的工程实践
java·数据分析·数据可视化