新增杂项

This commit is contained in:
somunslotus 2023-12-22 14:14:33 +08:00
parent 7fbcd0ebd3
commit 5f11e1a6b8
13 changed files with 12097 additions and 0 deletions

6284
docs/api-docs(1).json Normal file

File diff suppressed because it is too large Load Diff

5246
docs/api-docs(2).json Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,45 @@
{
"category_id": 2,
"component_name": "通用模型训练",
"component_label": "通用模型训练组件",
"description": "通用模型训练组件介绍",
"image": "镜像",
"working_directory": "工作目录",
"command": "启动命令",
"mount_path": "挂载目录",
"in_parameters": {
"--dataset": {
"type": "ref",
"item_type": "dataset",
"label": "选择数据集",
"require": 1,
"choice": [],
"default": "",
"placeholder": "",
"describe": "选择数据集",
"editable": 1,
"condition": ""
},
"--model_name": {
"type": "ref",
"item_type": "model",
"label": "选择模型",
"require": 0,
"choice": [],
"range": "$min,$max",
"default": "",
"placeholder": "",
"describe": "这里是这个参数的描述和备注",
"editable": 1,
"condition": "",
"form_info": {"name": "mnist", "path": "/mnt/e/xxxx"}
}
},
"out_parameters": {
"--model_output": {
"type": "str",
"path": "/model"
}
},
"env_variables": {}
}

115
docs/model-export.json5 Normal file
View File

@ -0,0 +1,115 @@
{
"category_id": 3,
"component_name": "model_export",
"component_label": "模型导出",
"description": "模型导出到平台模型库",
"image": "镜像", //自动关联镜像仓库,可选框, 可以为空,用户可以在流水线中再填写
"working_directory": "工作目录", //工作目录,不填写将直接使用镜像默认的工作目录
"command": "启动命令", //镜像的入口命令直接写成单行字符串例如python xx.py无需添加
"mount_path": "挂载目录", //支持pvc挂载, 需要确保pvc和pv绑定成功
"control_strategy": {
//组件的控制策略,模版注册时候不可见
"max_run_time": {
"type": "str",
"item_type": "",
// type为list时,list元素的类型
"label": "超时中断",
// 中文名
"require": 1,
// 是否必须
"choice": [],
// type为list时,可选的值
"default": "0",
// 默认值
"placeholder": "",
// 输入提示内容
"describe": "组件运行时长支持s(秒)m(分钟)h(小时)d(天)示例3h代表3个小时超时0表示不限制时长",
"editable": 1,
// 是否可修改
},
"retry_time": {
"type": "int",
"item_type": "",
// type为list时,list元素的类型
"label": "重试次数",
// 中文名
"require": 1,
// 是否必须
"choice": [],
// type为list时,可选的值
"default": "0",
// 默认值
"placeholder": "",
// 输入提示内容
"describe": "组件运行失败自动重试次数",
"editable": 1,
// 是否可修改
}
},
"resources_standard": { //资源规格,模版注册的时候不可见
"label":"资源规格", // 中文名
"choice":[
{"name":"CPU/GPU", "type":"list", "value":["GPU 0*v100,CPU:4,内存32GB","GPU 1*v100,CPU:4,内存16GB","GPU 1*A100,CPU:4,内存32GB"]},
{"name":"NPU", "type":"list", "value":["NPU 1*Ascend 910 CPU:24,显存:32GB,内存256GB", "NPU 2*Ascend 910 CPU:48,显存:32GB,内存512GB", "NPU 4*Ascend 910 CPU:96,显存:32GB,内存1024GB"]}], // type为enum/multiple时可选值
"placeholder":"", // 目前支持CPU/GPU/NPU
"describe":"资源规格目前支持CPU/GPU/NPU",
"editable":1, // 是否可修改
"condition":"", // 显示的条件 {"name":"", "value":"xxxxxx"}
},
"in_parameters":{
"--model_name":{ // "参数名"
"type":"str",
"item_type": "", //支持 str,ref, int, list
"label":"模型名称", // 中文名
"require":1, // 是否必须
"choice":[], // type为list时,可选的值
"default":"", // 默认值
"placeholder":"模型名称", // 输入提示内容
"describe":"模型名称",
"editable":1, // 是否可修改
"condition":"", // 显示的条件
},
"--model_type":{ // "参数名"
"type":"str",
"item_type": "", //支持 str,ref, int, list
"label":"模型类型", // 中文名
"require":1, // 是否必须
"choice":[], // type为list时,可选的值
"default":"", // 默认值
"placeholder":"模型类型", // 输入提示内容
"describe":"模型类型",
"editable":1, // 是否可修改
"condition":"", // 显示的条件
},
"--model_path": { // 参数名
"type":"str", //支持 str,ref, int, list
"item_type": "", // 在type为list时每个子参数的类型
"label":"模型路径", // 中文名
"require":0, // 是否必须
"choice":[], // type为list时可选值
"default":"master", // 默认值
"placeholder":"", // 输入提示内容
"describe":"模型路径",
"editable":1, // 是否可修改
"condition":"", // 显示的条件 表单信息:{"name":"mnist","path":"/mnt/e/xxxx"}
},
"--model_access": { // 参数名
"type":"str", //支持 str,ref, int, list
"item_type": "", // 在type为list时每个子参数的类型
"label":"模型权限", // 中文名
"require":0, // 是否必须
"choice":[], // type为list时可选值
"default":"1", // 默认值
"placeholder":"", // 输入提示内容
"describe":"模型访问权限private 私有public 公开",
"editable":1, // 是否可修改
"condition":"", // 显示的条件 表单信息:{"name":"mnist","path":"/mnt/e/xxxx"}
},
},
"env_virables": {
}
}

View File

@ -0,0 +1,153 @@
# -*- coding: utf-8 -*-
# ====== project dir config ======
SCRIPT_PATH=$(realpath "$0")
SCRIPT_DIR=$(dirname "$SCRIPT_PATH")
MAIN_DIR=$(dirname "$SCRIPT_DIR")
#add main_dir to python dir
# ====== model import dir ======
export PYTHONPATH=$MAIN_DIR:$PYTHONPATH
# ====== servers for openi ======
#servers=( $VC_TASK0_HOSTS $VC_TASK1_HOSTS $VC_TASK2_HOSTS $VC_TASK3_HOSTS $VC_TASK4_HOSTS $VC_TASK5_HOSTS $VC_TASK6_HOSTS $VC_TASK7_HOSTS )
for i in {0..11}
do
server="VC_TASK${i}_HOSTS"
servers[$i]=${!server}
done
echo "servers=${servers[@]}"
# ====== run command on each worker ======
#comand="/opt/conda/bin/pip install transformers"
commands=( "nvidia-smi | grep M" )
#commands=( "/opt/conda/bin/pip install transformers" )
for command in "${commands[@]}"
do
for server in "${servers[@]}"
do
echo "Executing command on $server"
ssh $server "cd $SCRIPT_DIR; $command"
done
done
# ====== Environment ======
# - NCCL & IB
export NCCL_DEBUG=ERROR #INFO ERROR
export NCCL_IB_DISABLE=0
#export NCCL_SOCKET_IFNAME=eth0
export NCCL_IB_GID_INDEX=3
export CUDA_DEVICE_MAX_CONNECTIONS=1
export CUDA_HOME="/usr/local/cuda"
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
#export NCCL_IB_HCA=mlx5_0,mlx5_1,mlx5_2,mlx5_3,mlx5_4,mlx5_5,mlx5_6,mlx5_7
# ====== hostfile ======
# HOSTFILE=/userhome/codeGeeX/hostfile
MASTER_IP=$VC_TASK0_HOSTS
rm $SCRIPT_DIR/hostfile
for server in "${servers[@]}"
do
echo "$server slots=8" >> $SCRIPT_DIR/hostfile
done
cat $SCRIPT_DIR/hostfile
echo "MASTER_IP=$MASTER_IP"
# ====== dir config ======
#DATASET_1="/userhome/dataset/7b_GPU_pretrain_0615/zh_bin/text_document"
#DATASET_2="/userhome/dataset/7b_GPU_pretrain_0615/en_bin/text_document"
#DATASET_3="/userhome/dataset/7b_GPU_pretrain_0615/code_bin/text_document"
#DATA_PATH="10 ${DATASET_1} 4 ${DATASET_2} 1 ${DATASET_3}"
DATA_PATH=/userhome/dataset/7b_GPU_260GB_stage9_0814_0814_fixVocab_bin/text_document
# ====== Parameters ======
# - 13B
#NLAYERS=39
#HIDDEN=5120
#NATTN_HEAD=40
#SEQLEN=2048
#TRIAL_TAG="13B-64a100-800g-0316-v1"
## - 350M
#NLAYERS=24 #39
#HIDDEN=1024
#NATTN_HEAD=16
#SEQLEN=1024
#TRIAL_TAG="350M-64a100-1T-0330-v1-test-time"
# 7B
NLAYERS=32 #39
HIDDEN=4096
NATTN_HEAD=32
SEQLEN=2048
TRIAL_TAG="7B-0814"
# ====== trial dir ======
TRIAL_NAME="pretrain-wanli"
# - logging & output
NOW=$(date +"%Y%m%d_%H%M%S")
OUTPUT_DIR=/userhome/model/wanli/$TRIAL_NAME-$TRIAL_TAG
TB_DIR=$OUTPUT_DIR/tb$NOW
TB_DIR=$OUTPUT_DIR/tb20230814_221138
mkdir -p $OUTPUT_DIR
mkdir -p $TB_DIR
# ====== run ======
echo "Launching deepspeed"
deepspeed \
--hostfile hostfile \
--master_addr $MASTER_IP \
$MAIN_DIR/pretrain_gpt.py \
--tensor-model-parallel-size 4 \
--pipeline-model-parallel-size 1 \
--num-layers $NLAYERS \
--hidden-size $HIDDEN \
--make-vocab-size-divisible-by 128 \
--num-attention-heads $NATTN_HEAD \
--seq-length $SEQLEN \
--max-position-embeddings $SEQLEN \
--micro-batch-size 8 \
--global-batch-size 1920 \
--lr 4e-6 \
--min-lr 1e-6 \
--lr-decay-style cosine \
--train-samples 42340948 \
--log-interval 1 \
--data-path $DATA_PATH \
--vocab-file $MAIN_DIR/megatron/tokenizer/llama_zh_hf \
--merge-file $MAIN_DIR/megatron/tokenizer/spm_13w/data_dict.128k.txt \
--save-interval 800 \
--save $OUTPUT_DIR \
--load /userhome/model/wanli/pretrain-wanli-7B-0807 \
--override-opt_param-scheduler \
--split 99,1,0 \
--clip-grad 1.0 \
--weight-decay 0.1 \
--adam-beta1 0.9 \
--adam-beta2 0.99 \
--bf16 \
--finetune \
--recompute-activations \
--use-flash-attn \
--dataloader-type 'single' \
--attention-softmax-in-fp32 \
--reset-position-ids \
--reset-attention-mask \
--eod-mask-loss \
--no-gradient-accumulation-fusion \
--no-async-tensor-model-parallel-allreduce \
--tokenizer-type LlamazhTokenizer \
--no-query-key-layer-scaling \
--timing-log-level 2 \
--data-cache-path /userhome/_megatron_cache/ \
--tensorboard-dir $TB_DIR |& tee ${OUTPUT_DIR}/$NOW.log

60
example/testGetImage.go Normal file
View File

@ -0,0 +1,60 @@
package main
import (
"fmt"
"github.com/google/go-containerregistry/pkg/authn"
"github.com/google/go-containerregistry/pkg/name"
"github.com/google/go-containerregistry/pkg/v1/remote"
"log"
"net/http"
)
func main() {
// 替换为你的 Harbor 仓库地址和镜像名称
harborRepository := "fzrj.harbor.com"
imageName := "fzrj.harbor.com/machine-learning/git:202312071000"
// 构建镜像的完整名称
imageRef, err := name.ParseReference(imageName)
if err != nil {
log.Fatalf("Error parsing image reference: %v", err)
}
// 使用 Harbor 仓库的地址构建远程镜像引用
remoteImageRef, err := name.NewTag(fmt.Sprintf("%s/%s", harborRepository, imageRef.Identifier()), name.WeakValidation)
if err != nil {
log.Fatalf("Error constructing remote image reference: %v", err)
}
// 获取 Docker 配置文件的路径(通常在用户主目录下)
//dockerConfigPath := os.ExpandEnv("$HOME/.docker/config.json")
// 从 Docker 配置文件中获取认证信息
authenticator, err := authn.DefaultKeychain.Resolve(remoteImageRef.Context().Registry)
if err != nil {
log.Fatalf("Error resolving Docker credentials: %v", err)
}
// 使用允许不安全传输的方式
options := []remote.Option{
remote.WithAuth(authenticator),
remote.WithTransport(http.DefaultTransport),
}
// 获取镜像的信息
image, err := remote.Image(remoteImageRef, options...)
if err != nil {
log.Fatalf("Error fetching image: %v", err)
}
// 获取镜像的配置信息
config, err := image.ConfigFile()
if err != nil {
log.Fatalf("Error fetching image config: %v", err)
}
// 输出镜像信息
fmt.Printf("Image Name: %s\n", imageRef.Name())
fmt.Printf("Image Digest: %s\n", imageRef.Identifier())
fmt.Printf("Image Architecture: %s\n", config.Architecture)
fmt.Printf("Image OS: %s\n", config.OS)
}

39
example/upload.go Normal file
View File

@ -0,0 +1,39 @@
package main
import (
"context"
"fmt"
myminio "github.com/minio/minio-go/v7"
"github.com/minio/minio-go/v7/pkg/credentials"
"log"
)
harborRepository := "fzrj.harbor.com"
imageName := "fzrj.harbor.com/machine-learning/git:202312071000"
func main() {
endpoint := "minio.argo:9000" // 例如: "localhost:9000"
accessKeyID := "admin"
secretAccessKey := "qazxc123456."
useSSL := false // 如果MinIO部署在HTTPS上则设置为true
// 初始化MinIO客户端
minioClient, err := myminio.New(endpoint, &myminio.Options{
Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
Secure: useSSL,
})
// 要上传的文件
filePath := "git-clone.yaml"
bucketName := "platform-data"
objectName := "somuns/dataset/caffe/git-clone.yaml"
// 使用FPutObject上传文件
info, err := minioClient.FPutObject(context.Background(), bucketName, objectName, filePath, myminio.PutObjectOptions{ContentType: "application/octet-stream"})
if err != nil {
fmt.Print("upload err:", err.Error())
log.Fatalln(err)
}
log.Printf("Successfully uploaded %s of size %d\n", objectName, info)
}

View File

@ -0,0 +1 @@
package parse

View File

@ -0,0 +1,10 @@
FROM bitnami/python
WORKDIR /app
COPY model_export.py /app
COPY sources.list /etc/apt/
# 更新 sources.list 后安装 ssh
RUN apt-get update && apt-get install -y ssh
ENTRYPOINT ["python", "git_clone.py"]

View File

@ -0,0 +1,9 @@
#!/bin/bash
tag=$(date +'%Y%m%d%H%M')
docker build \
--build-arg "HTTP_PROXY=http://172.20.32.253:3128" \
--build-arg "HTTPS_PROXY=http://172.20.32.253:3128" \
-t fzrj.harbor.com/machine-learning/git:${tag} .
docker push fzrj.harbor.com/machine-learning/git:${tag}

View File

@ -0,0 +1,19 @@
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM2VENDQWRHZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQ0FYRFRJek1URXdNekF4TURJMU1sb1lEekl4TWpNeE1ERXdNREV3TWpVeVdqQVZNUk13RVFZRApWUVFERXdwcmRXSmxjbTVsZEdWek1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBCjJmTjg3MGg5N2RlTlh4ank5T0p5R1ZIcnVmd1BtM05Ma0F5VkwzUUhCUjROVXFQc2N5a1FpTFNUSE1TZWp6L2sKWUsrOWFQVjM5ekJiNjZlSmFaM3V6QitKcktYZXVDcUlZMHNNWlNSN3VxUWVWRVlYSDExL1F0WXdZRG5qQ1dNRgpvQ2RERkk2L0MzTm9zTEU3b3hxb2RvSGhkZFVRUno3L3U0UERxNngwVlN5U29uQTIwbEc4eXFCNmpudGduczkwCjdkNkFTclJRME5ZeHpNTXczTXI0dVJNdTBYY0FkQVFaVmc1MDcyU2hSQk1RVW56bnQzRkNxcGhLWjM1Ny9tWDUKZG55Uml4aEd5MGNOWThacjhmWXJnMGYwQ0plbTJaSGd6MEp1STZ1MUNEYlRMaVQ0dUFLRUdsYXpCNDY2eU01TwpjQWpjVytxVGJzaTBQOGZpTGx6d1pRSURBUUFCbzBJd1FEQU9CZ05WSFE4QkFmOEVCQU1DQXFRd0R3WURWUjBUCkFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVQVDU1Zk5UVmtTUVJzOGdDcTZWZi8yZWNaY2t3RFFZSktvWkkKaHZjTkFRRUxCUUFEZ2dFQkFGVWVRVEVId3dJY2J2cEllU2ZZSnJ0WDhaZUttcmVLZnROQ2VRT0dpOWhwUW1VTwpnU2JSVjdGZkRHaktJUWtTVEU4UkZ4L3haRHltdTVIRmdrVVpoc0ptVjFFSU9XcXFiMzRDeWJPOGR2Sm9QeXpqClBYV1BxSWEvRVNFNWVqRUZqUXoyZHJIZDVacVowMldFY01iclVDYXhmeDJPUkNKa0pIYXNkQWNyNG5LSWlsankKemp2TGJ5NDFtT0hhMWREdlEvUi9lT2lSV2dISEszYkQ2REV3bjk4TEhCUUJtSW1XdDVHcFVJTnFxN2w2ZVNKOQpxSnkwZDNoM0FQMmlyeDFBNEVDSVEwWVFrNS9IMU0weEMrSENkNUt6UkUvdHpvenlCU3FNSWFUMENmN0t1Y1l0CjNDU0hKQWtCSkpoRkRFcElrVkw0a25iNnl6MFF6RjBYbCt4ZGhlMD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
server: https://apiserver.cluster.local:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURGVENDQWYyZ0F3SUJBZ0lJU05BVDZEcHlHSEV3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWdGdzB5TXpFeE1ETXdNVEF5TlRKYUdBOHlNVEl6TVRBeE1EQXhNREkxTTFvdwpOREVYTUJVR0ExVUVDaE1PYzNsemRHVnRPbTFoYzNSbGNuTXhHVEFYQmdOVkJBTVRFR3QxWW1WeWJtVjBaWE10CllXUnRhVzR3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRHFBMHAvTmNaMEpXU0UKRUFCTVNISktjbHViNjF3Tzd0VUYrd3BhNFRVQXNyU3IrZnp4Z01BUzFVenplem16ajQ1UElxSmRyZEZIY3Y0TApwRnFkK2o0dHNaZzlJRXMvU2ozL3ZEdWhBb3gydnByUC9iK3N6dWs5OHkyd3lOeHNIN3V2RHh2ZjFFMVRxSzdXCmxocks5RVRyWkFKNEhnY1dLbkVzMW44Z09iZ2F5aDdiVkJWVmhCbFY4VDVpSTBPNWZlbHdMaVQvMXhNVUk4TEwKd3ZUalQzQngxd2duUlBBdjNvc2s3VHJobjlCQysyZUZCWWwzeHI4NnRmc2JDUktHWmpNZm1lc0FLNmFzTkpFLwpyUmo0RXhNd2NYeGxpNmRRdk5QaHNQbnBzQ3JpZ21BdkdyblFPdldTaHRlbXRjTEdMUldvaTZ4Q0ViZU93QUlKCjg4UlROT1hwQWdNQkFBR2pTREJHTUE0R0ExVWREd0VCL3dRRUF3SUZvREFUQmdOVkhTVUVEREFLQmdnckJnRUYKQlFjREFqQWZCZ05WSFNNRUdEQVdnQlE5UG5sODFOV1JKQkd6eUFLcnBWLy9aNXhseVRBTkJna3Foa2lHOXcwQgpBUXNGQUFPQ0FRRUExWCthNXowUWx5NEFsQWsrZDJSaFFrVFB1T3BVRVExajlNVGNLK1FFdEphbmZzbVhVNmZCCmZmdGIxeHdrQzE5QWsvS2N6QkEyU3BKMDExUWhBZFJTRk1QVVhVUmU4a1F3WWpGK0J3QUF1ZUordEV0VVdmSXQKdnFoWjI0ekxaMU84NHJMRkRkZThYYkFvTFJWM29BTThucDEranI0cGZZVEU4aHNrZXZ5TzAxWnFOMzhIODdIagphNjg3TytwRjg4YXhsMEx3ZkpFK2Vja1FaT25DekF1WSticmZkV3FuQllYUlhyVGxiUzQxMHE2V0pPSldjZUNTClllenpudVM0MWxJdHBGQ0UrYzFIajRrajUyZncrUWd6dWhBb1JnRXY3S1ptbWNwbVlIZ0dvMVNKWWpQUTNiVW4KZmdNdHBrcldKL2RGN25xaTA3K3RPR0pnc05EYWgweDJhdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcGdJQkFBS0NBUUVBNmdOS2Z6WEdkQ1ZraEJBQVRFaHlTbkpibSt0Y0R1N1ZCZnNLV3VFMUFMSzBxL244CjhZREFFdFZNODNzNXM0K09UeUtpWGEzUlIzTCtDNlJhbmZvK0xiR1lQU0JMUDBvOS83dzdvUUtNZHI2YXovMi8Kck03cFBmTXRzTWpjYkIrN3J3OGIzOVJOVTZpdTFwWWF5dlJFNjJRQ2VCNEhGaXB4TE5aL0lEbTRHc29lMjFRVgpWWVFaVmZFK1lpTkR1WDNwY0M0ay85Y1RGQ1BDeThMMDQwOXdjZGNJSjBUd0w5NkxKTzA2NFovUVF2dG5oUVdKCmQ4YS9Pclg3R3drU2htWXpINW5yQUN1bXJEU1JQNjBZK0JNVE1IRjhaWXVuVUx6VDRiRDU2YkFxNG9KZ0x4cTUKMERyMWtvYlhwclhDeGkwVnFJdXNRaEczanNBQ0NmUEVVelRsNlFJREFRQUJBb0lCQVFEZFFpRlU1L1pzNk5JQwpIOUw0VFdOcXluZWRrOHBtQUNHQVZ4MHlVazg0Q3IvUy96bk82aW94WkdZdXJLc2hBTEhRVnZIbjJ5bk9BWWI4CllQaWc5L09FWnErSDFCbnhqSFBVY2hoN0l4ckdSMisvQ3JBSloxV1hFbTk0QUdLUkJPd0RHQ2tGMkFrSSthdmUKRHV6a1NsTkRzVHE0Y2NQSGpIZVhxbk5tZDh4LzNoNnVWeHE2bVgzSFJ1SHpPeDEwUGYzV0tuRnFaRW1vcDA5QgpXbEhDQW1TTkd5V1ZsVSs0cDVacGFBbkk2SHZIblJnbDErKzA1NTZ3VFk2ZHd5WWNzcW1oMkx2aDlPWDQ2dVc3CmNTNHlpeGt2c0VkUzRWUVBZRTNTVXdTajdlWVhXWndHR0ZzL3ViRWFacXhZOEdYZlVBY013eFZ3eExZTEk2NTEKSVVLL3hOTEZBb0dCQVBmeC82QjhRLy9ITWlpMEZPeDliTmtldnJIbGd0OEp5MXZOeUE3YlVzWTBEWmNKdXA4SwpSbnVZdkpMejg1SEFycnptbkJoZXhsOE9vc0tSQ0pzOERmYmVJMUZMdlJ0WnJhMUZzcFlsTldvOUpOeEgzalZBCmZpbFFwM0ZzN2VwY3BkcVc5ZFBnblkzS2VMUzU2VUVzQWhLZW81aTRLcEo0amZFb1JWdHNnY3lmQW9HQkFQR2QKYk53eEdscW9EbnIxdCtqbnNyNk95UEw0SVhZdkRYamRwRG5vcitmMElEc1B6YzlRa2tCeldzVXpDSCt6bGxFNgpqV1VRUzVyNVpRV3ZUZ3lrM1NHNTR3ekNyWHRTaGZoKzNVQUVQQVJ1bkVEWm9xaW9FaWlFVVVNVnN4NW5zZ2Q3ClE2ckxrSmhCSHlSa3F0VVFzNDlyVUxnRVpiR0haNFBidEZGd1pEaDNBb0dCQU5GQzNZeUZWSjY3Y0FvS2N0NWwKdlVoQ09vL0tOUG9wT2dqeFZMZTFROWNrZDVQU0VqL0lYRlJVUkZPQ3NUK0NiL2ZlYWovblBXVmM1T0Z4cHVIZApmYXV0TUFHYytxM3FzanBiYUs1d0dQVGhSZ3JrWFJaMHFBWVduRHVPdy8zWTArSDVKdUQ3NGYyWnRPWlRRaHBQCkdqQzgwelpCdVN5RnNzYW1SbU15NFJuaEFvR0JBTDB0MS9pb2Njd2QzZ2lrc0hVcVJhZ3l3R0NOckJXUFRlc2YKRCtGUHNidmFTQW8ybTUwQnB5SFRzSFRMT3BKU21SWE0xTDBXL3p1K25qelBRRHRpTXNxZmM0bWdQSmxjeWcwQgp1RmJSZWZTMmJwM1FTaTNvT3grQ1N1Wk43VXVYUWF2ZDllT2JOQUlpcXpHaHFLamZSTmk4M0J6WlJJNjJTSFRUCjUrSUVNRlNOQW9HQkFNdWo2L1VKRnFuYlAzaTM1TTlzc1dySmFSRlVjUkUyZ0w0dnk0ZFgrWHp6ZlU0NTVXdGsKbGpSZnlPZS9iZzFQTk9ScTJ0cVpNb0I1UXZFYUxKRHRpdGdOcWpRT2gwOS9neFErcGFIVlFTYk95MkJhN2Vacgo4S1B6TlFkSmNKU1JDeVRiRmYrOFk0MmhmMHVRbTBhbEpIM05YTmxiQ3dQamoxSGx2MjBWay9RaQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=

View File

@ -0,0 +1,71 @@
import argparse
import os
from kubernetes import client, config
from minio import Minio
# from minio.error import ResponseError
from minio.error import S3Error
def get_minio_credentials(secret_name, access_key_key, secret_key_key):
# 从 Secret 中获取 MinIO 的 AccessKey 和 SecretKey
kubeconfig_path = 'kubeconfig'
config.load_kube_config(kubeconfig_path) # 加载默认的 kubeconfig 文件
v1 = client.CoreV1Api()
namespace = "argo"
secret = v1.read_namespaced_secret(secret_name, namespace)
access_key = secret.data[access_key_key].decode("utf-8")
secret_key = secret.data[secret_key_key].decode("utf-8")
return access_key, secret_key
def upload_model_to_minio(minio_endpoint, bucket_name, model_name, model_path, model_type, model_access):
# 初始化 MinIO 客户端
#access_key, secret_key = get_minio_credentials("my-minio-cred", "accesskey", "secretkey")
access_key = "admin"
secret_key = "qazxc123456."
minio_client = Minio(minio_endpoint,
access_key=access_key,
secret_key=secret_key,
secure=False)
# 递归上传目录下的所有文件
for root, dirs, files in os.walk(model_path):
for file in files:
file_path = os.path.join(root, file)
relative_path = os.path.relpath(file_path, model_path)
object_name = os.path.join(model_type, model_name, relative_path).replace(os.sep, "/")
# 设置上传选项
content_type = "application/octet-stream"
user_metadata = {'x-amz-acl': model_access}
# 读取文件内容
with open(file_path, 'rb') as file_data:
try:
# 使用 MinIO 客户端上传文件
minio_client.put_object(bucket_name, object_name, file_data, os.path.getsize(file_path),
content_type=content_type, metadata=user_metadata)
except S3Error as err:
print(f"Error uploading {file_path} to MinIO: {err}")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Upload model files to MinIO')
parser.add_argument('--model-name', required=True, help='Model name')
parser.add_argument('--model-path', required=True, help='Local path to model directory')
parser.add_argument('--model-type', required=True, help='Model type')
parser.add_argument('--model-access', required=True, help='Model access')
minio_endpoint = "minio.argo.svc.cluster.local:9000"
bucket_name = "platform-data"
args = parser.parse_args()
upload_model_to_minio(minio_endpoint, bucket_name, args.model_name, args.model_path, args.model_type,
args.model_access)

View File

@ -0,0 +1,45 @@
{
"category_id": 4,
"component_name": "distributed-model-train",
"component_label": "分布式模型训练组件",
"description": "分布式模型训练组件支持deepspeed, metatron, horovod",
"image": "镜像",
"working_directory": "工作目录",
"command": "启动命令",
"mount_path": "挂载目录",
"in_parameters": {
"--dataset": {
"type": "ref",
"item_type": "dataset",
"label": "选择数据集",
"require": 1,
"choice": [],
"default": "",
"placeholder": "",
"describe": "选择数据集",
"editable": 1,
"condition": ""
},
"--model_name": {
"type": "ref",
"item_type": "model",
"label": "选择模型",
"require": 0,
"choice": [],
"range": "$min,$max",
"default": "",
"placeholder": "",
"describe": "这里是这个参数的描述和备注",
"editable": 1,
"condition": "",
"form_info": {"name": "mnist", "path": "/mnt/e/xxxx"}
}
},
"out_parameters": {
"--model_output": {
"type": "str",
"path": "/model"
}
},
"env_variables": {}
}