remote-task-excutor-cli/pkg/service/common/task_builder.go

154 lines
4.0 KiB
Go

package common
import (
"context"
"remote-task-excutor-cli/pkg/models"
"remote-task-excutor-cli/pkg/service/preparation"
)
// TaskType 任务类型常量
const (
TrainingTaskType = "AI" // 训练任务类型
InferenceTaskType = "Inference" // 推理任务类型
)
// BuildSubmitTaskRequest 构建提交任务请求的通用函数
func BuildSubmitTaskRequest(ctx context.Context, authData *models.AuthData, config *models.RunConfig,
clusterID string, bindResultSet *models.BindResultSet, taskType string) models.SubtaskRequest {
// 根据任务类型决定是否包含数据返回任务
var jobs []models.Job
// 主任务
mainJob := models.Job{
LocalJobID: models.MainTaskID,
Name: "remote-task" + preparation.GenerateUniqueID(),
Description: "材料平台远程任务",
Type: taskType,
Files: &models.JobFiles{
Dataset: models.FileBinding{
Type: preparation.TaskBindingType,
BindingID: bindResultSet.BindDatasetID,
},
Model: models.FileBinding{
Type: preparation.TaskBindingType,
BindingID: bindResultSet.BindModelID,
},
Image: models.ImageBinding{
Type: "Image",
ImageID: config.Image,
},
},
JobResources: &models.JobResources{
ScheduleStrategy: "dataLocality",
Clusters: []models.Cluster{
{
ClusterID: clusterID,
Runtime: models.Runtime{
Envs: config.RunArgs,
Params: config.RunArgs,
},
Code: models.CodeInfo{
Type: preparation.TaskBindingType,
BindingID: bindResultSet.BindCodeID,
},
Resources: config.Resource.Resources,
},
},
},
}
jobs = append(jobs, mainJob)
// 只有训练任务才需要数据返回任务
if taskType == TrainingTaskType {
dataReturnJob := models.Job{
LocalJobID: models.DataReturnTaskID,
Type: models.DataReturnType,
TargetJob: []models.TargetJob{
{
TargetJobID: models.MainTaskID,
InputParams: models.InputParams{
PackageName: "Name",
ClusterID: "ClusterID",
Output: "Output",
},
},
},
}
jobs = append(jobs, dataReturnJob)
}
return models.SubtaskRequest{
UserID: authData.JsmUserInfo.Data.UserID,
JobSetInfo: models.JobSetInfo{
Jobs: jobs,
},
}
}
// BuildInferenceSubmitTaskRequest 构建推理任务提交请求
func BuildInferenceSubmitTaskRequest(ctx context.Context, authData *models.AuthData,
codeBindingID, modelBindingID, subModelBindingID int, imageID int, clusterID string,
resourceType string, resources []models.ResourcesItem, command string, description string) models.InferenceSubmitTaskResponseData {
// 构建文件信息
files := models.InferenceJobFiles{
Model: models.FileBinding{
Type: "Binding",
BindingID: modelBindingID,
},
Image: models.ImageBinding{
Type: "Image",
ImageID: imageID,
},
}
// 如果有增量模型,添加到文件信息中
if subModelBindingID > 0 {
files.SubModel = &models.FileBinding{
Type: "Binding",
BindingID: subModelBindingID,
}
}
// 构建任务
job := models.InferenceJob{
LocalJobID: models.MainTaskID,
Name: "inference-task" + preparation.GenerateUniqueID(),
Description: description,
Type: "PCM_Inference",
Files: &files,
JobResources: &models.InferenceJobResources{
ScheduleStrategy: "dataLocality",
Clusters: []models.InferenceCluster{
{
ClusterID: clusterID,
Runtime: models.Runtime{
Envs: make(map[string]string),
Params: make(map[string]string),
},
Code: models.CodeInfo{
Type: "Binding",
BindingID: codeBindingID,
},
Resources: resources,
},
},
},
}
return models.InferenceSubmitTaskResponseData{
TaskInfo: models.InferenceTaskInfo{
UserID: authData.JsmUserInfo.Data.UserID,
JobSetInfo: models.InferenceJobSetInfo{
Jobs: []models.InferenceJob{job},
},
},
ResultInfo: models.InferenceResultInfo{
LocalJobID: models.MainTaskID,
JobSetID: "", // 这个会在提交后由服务器返回
},
}
}