@@ -92,20 +92,14 @@ type Action struct { | |||
} | |||
type ActionShow struct { | |||
UserID int64 | |||
OpType ActionType | |||
ActUserID int64 | |||
ActUser *UserShow | |||
RepoID int64 | |||
Repo *RepositoryShow | |||
CommentID int64 | |||
Comment *Comment `xorm:"-"` | |||
IsDeleted bool `xorm:"INDEX NOT NULL DEFAULT false"` | |||
RefName string | |||
IsPrivate bool `xorm:"INDEX NOT NULL DEFAULT false"` | |||
IsTransformed bool `xorm:"INDEX NOT NULL DEFAULT false"` | |||
Content string `xorm:"TEXT"` | |||
CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` | |||
OpType ActionType | |||
RepoLink string | |||
ShortRepoFullDisplayName string | |||
Content string | |||
RefName string | |||
IssueInfos []string | |||
CommentLink string | |||
IssueTitle string | |||
} | |||
// GetOpType gets the ActionType of this action. | |||
@@ -243,6 +237,43 @@ func (a *Action) GetRepoLink() string { | |||
return "/" + a.GetRepoPath() | |||
} | |||
func (a *Action) ToShow() *ActionShow { | |||
actionShow := &ActionShow{} | |||
actionShow.OpType = GetTaskOptType(*a) | |||
actionShow.Content = a.Content | |||
actionShow.RefName = a.RefName | |||
if strings.Contains(a.Content, "|") { | |||
actionShow.IssueInfos = a.GetIssueInfos() | |||
actionShow.IssueTitle = a.GetIssueTitle() | |||
} | |||
if a.Repo != nil { | |||
actionShow.RepoLink = a.GetRepoLink() | |||
actionShow.ShortRepoFullDisplayName = a.ShortRepoFullDisplayName() | |||
} | |||
if a.Comment != nil { | |||
actionShow.CommentLink = a.GetCommentLink() | |||
} | |||
return actionShow | |||
} | |||
func GetTaskOptType(action Action) ActionType { | |||
switch action.OpType { | |||
case ActionCreateDebugGPUTask, | |||
ActionCreateDebugNPUTask, | |||
ActionCreateTrainTask, | |||
ActionCreateInferenceTask, | |||
ActionCreateBenchMarkTask, | |||
ActionCreateGPUTrainTask: | |||
return ActionCreateCloudbrainTask | |||
default: | |||
return action.OpType | |||
} | |||
} | |||
// GetRepositoryFromMatch returns a *Repository from a username and repo strings | |||
func GetRepositoryFromMatch(ownerName string, repoName string) (*Repository, error) { | |||
var err error | |||
@@ -439,7 +470,7 @@ func GetActionByIds(ids []int64) ([]*Action, error) { | |||
if err != nil { | |||
return nil, err | |||
} | |||
if err := ActionList(actions).LoadAttributes(); err != nil { | |||
if err := ActionList(actions).LoadAllAttributes(); err != nil { | |||
return nil, fmt.Errorf("ActionList loadAttributes: %v", err) | |||
} | |||
return actions, nil | |||
@@ -79,6 +79,48 @@ func (actions ActionList) LoadRepositories() ([]*Repository, error) { | |||
return actions.loadRepositories(x) | |||
} | |||
func (actions ActionList) getCommentIDs() []int64 { | |||
commentIDs := make(map[int64]struct{}, len(actions)) | |||
for _, action := range actions { | |||
if action.CommentID == 0 { | |||
continue | |||
} | |||
if _, ok := commentIDs[action.CommentID]; !ok { | |||
commentIDs[action.CommentID] = struct{}{} | |||
} | |||
} | |||
return keysInt64(commentIDs) | |||
} | |||
func (actions ActionList) loadComments(e Engine) ([]*Comment, error) { | |||
if len(actions) == 0 { | |||
return nil, nil | |||
} | |||
commentIDs := actions.getCommentIDs() | |||
commentMaps := make(map[int64]*Comment, len(commentIDs)) | |||
if len(commentIDs) == 0 { | |||
return make([]*Comment, 0), nil | |||
} | |||
err := e. | |||
In("id", commentIDs). | |||
Find(&commentMaps) | |||
if err != nil { | |||
return nil, fmt.Errorf("find comment: %v", err) | |||
} | |||
for _, action := range actions { | |||
action.Comment = commentMaps[action.CommentID] | |||
} | |||
return valuesComment(commentMaps), nil | |||
} | |||
// LoadComments loads actions' all comments | |||
func (actions ActionList) LoadComments() ([]*Comment, error) { | |||
return actions.loadComments(x) | |||
} | |||
// loadAttributes loads all attributes | |||
func (actions ActionList) loadAttributes(e Engine) (err error) { | |||
if _, err = actions.loadUsers(e); err != nil { | |||
@@ -96,3 +138,26 @@ func (actions ActionList) loadAttributes(e Engine) (err error) { | |||
func (actions ActionList) LoadAttributes() error { | |||
return actions.loadAttributes(x) | |||
} | |||
// LoadAllAttributes loads all attributes of the actions | |||
// compare with LoadAttributes() ,LoadAllAttributes() loads Comment attribute | |||
func (actions ActionList) LoadAllAttributes() error { | |||
return actions.loadAllAttributes(x) | |||
} | |||
// loadAllAttributes | |||
func (actions ActionList) loadAllAttributes(e Engine) (err error) { | |||
if _, err = actions.loadUsers(e); err != nil { | |||
return | |||
} | |||
if _, err = actions.loadRepositories(e); err != nil { | |||
return | |||
} | |||
if _, err = actions.loadComments(e); err != nil { | |||
return | |||
} | |||
return nil | |||
} |
@@ -169,69 +169,23 @@ type Cloudbrain struct { | |||
} | |||
type CloudbrainShow struct { | |||
JobID string `xorm:"INDEX NOT NULL"` | |||
JobType string `xorm:"INDEX NOT NULL DEFAULT 'DEBUG'"` | |||
JobName string | |||
DisplayJobName string | |||
Status string | |||
UserID int64 `xorm:"INDEX NOT NULL"` | |||
RepoID int64 `xorm:"INDEX NOT NULL"` | |||
SubTaskName string | |||
ContainerID string | |||
ContainerIp string | |||
CreatedUnix timeutil.TimeStamp `xorm:"INDEX"` | |||
UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"` | |||
Duration int64 `xorm:"DEFAULT 0"` //运行时长 单位秒 | |||
TrainJobDuration string `xorm:"DEFAULT '00:00:00'"` | |||
Image string //镜像名称 | |||
GpuQueue string //GPU类型即GPU队列 | |||
ResourceSpecId int //GPU规格id | |||
DeletedAt time.Time `xorm:"deleted"` | |||
CanDebug bool `xorm:"-"` | |||
CanDel bool `xorm:"-"` | |||
CanModify bool `xorm:"-"` | |||
Type int | |||
BenchmarkTypeID int | |||
BenchmarkChildTypeID int | |||
VersionID int64 //版本id | |||
VersionName string `xorm:"INDEX"` //当前版本 | |||
Uuid string //数据集id | |||
DatasetName string | |||
VersionCount int //任务的当前版本数量,不包括删除的 | |||
IsLatestVersion string //是否是最新版本,1是,0否 | |||
CommitID string //提交的仓库代码id | |||
PreVersionName string //父版本名称 | |||
ComputeResource string //计算资源,例如npu | |||
EngineID int64 //引擎id | |||
TrainUrl string //输出模型的obs路径 | |||
BranchName string //分支名称 | |||
Parameters string //传给modelarts的param参数 | |||
BootFile string //启动文件 | |||
DataUrl string //数据集的obs路径 | |||
LogUrl string //日志输出的obs路径 | |||
PreVersionId int64 //父版本的版本id | |||
FlavorCode string //modelarts上的规格id | |||
Description string `xorm:"varchar(256)"` //描述 | |||
WorkServerNumber int //节点数 | |||
FlavorName string //规格名称 | |||
EngineName string //引擎名称 | |||
TotalVersionCount int //任务的所有版本数量,包括删除的 | |||
LabelName string //标签名称 | |||
ModelName string //模型名称 | |||
ModelVersion string //模型版本 | |||
CkptName string //权重文件名称 | |||
ResultUrl string //推理结果的obs路径 | |||
ID int64 | |||
JobType string | |||
DisplayJobName string | |||
Duration string | |||
ResourceSpec *ResourceAndFlavor | |||
ComputeResource string | |||
} | |||
User *User `xorm:"-"` | |||
Repo *Repository `xorm:"-"` | |||
BenchmarkType string `xorm:"-"` //算法评测,模型评测 | |||
BenchmarkTypeName string `xorm:"-"` | |||
BenchmarkTypeRankLink string `xorm:"-"` | |||
StartTime timeutil.TimeStamp | |||
EndTime timeutil.TimeStamp | |||
func (task *Cloudbrain) ToShow() *CloudbrainShow { | |||
return &CloudbrainShow{ | |||
ID: task.ID, | |||
JobType: task.JobType, | |||
DisplayJobName: task.DisplayJobName, | |||
Duration: task.TrainJobDuration, | |||
ResourceSpec: GetCloudbrainResourceSpec(task.JobType, task.Type, task.ResourceSpecId, task.FlavorCode), | |||
ComputeResource: task.ComputeResource, | |||
} | |||
} | |||
func (task *Cloudbrain) ComputeAndSetDuration() { | |||
@@ -1917,11 +1871,11 @@ func GetStartedCloudbrainTaskByUpdatedUnix(startTime, endTime time.Time) ([]Clou | |||
return r, nil | |||
} | |||
func GetCloudbrainByIds(ids []int64) ([]Cloudbrain, error) { | |||
func GetCloudbrainByIds(ids []int64) ([]*Cloudbrain, error) { | |||
if len(ids) == 0 { | |||
return nil, nil | |||
} | |||
cloudbrains := make([]Cloudbrain, 0) | |||
cloudbrains := make([]*Cloudbrain, 0) | |||
err := x.In("id", ids).Unscoped().Find(&cloudbrains) | |||
if err != nil { | |||
return nil, err | |||
@@ -1930,31 +1884,128 @@ func GetCloudbrainByIds(ids []int64) ([]Cloudbrain, error) { | |||
} | |||
var ( | |||
DebugResourceSpecs *ResourceSpecs | |||
TrainResourceSpecs *ResourceSpecs | |||
SpecsMapInitFlag = false | |||
CloudbrainDebugResourceSpecsMap map[int]*ResourceSpec | |||
CloudbrainTrainResourceSpecsMap map[int]*ResourceSpec | |||
CloudbrainBenchmarkResourceSpecsMap map[int]*ResourceSpec | |||
ModelArtsDebugResourceSpecsMap map[string]*FlavorInfo | |||
ModelArtsTrainResourceSpecsMap map[string]*FlavorInfo | |||
) | |||
func GetResourceSpec(jobType string, resourceSpecId int) *ResourceSpec { | |||
if jobType == string(JobTypeTrain) { | |||
if TrainResourceSpecs == nil { | |||
json.Unmarshal([]byte(setting.TrainResourceSpecs), &TrainResourceSpecs) | |||
type ModelArtsFlavor struct { | |||
Info []struct { | |||
Code string `json:"code"` | |||
Value string `json:"value"` | |||
UnitPrice int64 `json:"unitPrice"` | |||
} `json:"flavor"` | |||
} | |||
func InitResourceSpecMap() { | |||
if CloudbrainDebugResourceSpecsMap == nil || len(CloudbrainDebugResourceSpecsMap) == 0 { | |||
t := ResourceSpecs{} | |||
json.Unmarshal([]byte(setting.ResourceSpecs), &t) | |||
CloudbrainDebugResourceSpecsMap = make(map[int]*ResourceSpec, len(t.ResourceSpec)) | |||
for _, spec := range t.ResourceSpec { | |||
CloudbrainDebugResourceSpecsMap[spec.Id] = spec | |||
} | |||
for _, spec := range TrainResourceSpecs.ResourceSpec { | |||
if resourceSpecId == spec.Id { | |||
return spec | |||
} | |||
} | |||
if CloudbrainTrainResourceSpecsMap == nil || len(CloudbrainTrainResourceSpecsMap) == 0 { | |||
t := ResourceSpecs{} | |||
json.Unmarshal([]byte(setting.TrainResourceSpecs), &t) | |||
CloudbrainTrainResourceSpecsMap = make(map[int]*ResourceSpec, len(t.ResourceSpec)) | |||
for _, spec := range t.ResourceSpec { | |||
CloudbrainTrainResourceSpecsMap[spec.Id] = spec | |||
} | |||
} else { | |||
if DebugResourceSpecs == nil { | |||
json.Unmarshal([]byte(setting.ResourceSpecs), &DebugResourceSpecs) | |||
} | |||
if CloudbrainBenchmarkResourceSpecsMap == nil || len(CloudbrainBenchmarkResourceSpecsMap) == 0 { | |||
t := ResourceSpecs{} | |||
json.Unmarshal([]byte(setting.BenchmarkResourceSpecs), &t) | |||
CloudbrainBenchmarkResourceSpecsMap = make(map[int]*ResourceSpec, len(t.ResourceSpec)) | |||
for _, spec := range t.ResourceSpec { | |||
CloudbrainBenchmarkResourceSpecsMap[spec.Id] = spec | |||
} | |||
} | |||
if ModelArtsDebugResourceSpecsMap == nil || len(ModelArtsDebugResourceSpecsMap) == 0 { | |||
t := FlavorInfos{} | |||
json.Unmarshal([]byte(setting.FlavorInfos), &t) | |||
ModelArtsDebugResourceSpecsMap = make(map[string]*FlavorInfo, len(t.FlavorInfo)) | |||
for _, spec := range t.FlavorInfo { | |||
ModelArtsDebugResourceSpecsMap[spec.Value] = spec | |||
} | |||
for _, spec := range DebugResourceSpecs.ResourceSpec { | |||
if resourceSpecId == spec.Id { | |||
return spec | |||
} | |||
if ModelArtsTrainResourceSpecsMap == nil || len(ModelArtsTrainResourceSpecsMap) == 0 { | |||
t := ModelArtsFlavor{} | |||
json.Unmarshal([]byte(setting.TrainJobFLAVORINFOS), &t) | |||
ModelArtsTrainResourceSpecsMap = make(map[string]*FlavorInfo, len(t.Info)) | |||
for _, spec := range t.Info { | |||
f := &FlavorInfo{ | |||
Value: spec.Code, | |||
Desc: spec.Value, | |||
UnitPrice: spec.UnitPrice, | |||
} | |||
ModelArtsTrainResourceSpecsMap[spec.Value] = f | |||
} | |||
} | |||
SpecsMapInitFlag = true | |||
} | |||
type ResourceAndFlavor struct { | |||
ResourceSpec *ResourceSpec | |||
FlavorInfo *FlavorInfo | |||
} | |||
func NewResourceAndFlavor(resourceSpec *ResourceSpec, flavorInfo *FlavorInfo) *ResourceAndFlavor { | |||
return &ResourceAndFlavor{ | |||
ResourceSpec: resourceSpec, | |||
FlavorInfo: flavorInfo, | |||
} | |||
} | |||
func GetCloudbrainResourceSpec(jobType string, clusterType int, resourceSpecId int, flavorCode string) *ResourceAndFlavor { | |||
if !SpecsMapInitFlag { | |||
InitResourceSpecMap() | |||
} | |||
if clusterType == TypeCloudBrainOne { | |||
switch jobType { | |||
case string(JobTypeDebug): | |||
return NewResourceAndFlavor(CloudbrainDebugResourceSpecsMap[resourceSpecId], nil) | |||
case string(JobTypeTrain): | |||
return NewResourceAndFlavor(CloudbrainTrainResourceSpecsMap[resourceSpecId], nil) | |||
case string(JobTypeBenchmark): | |||
return NewResourceAndFlavor(CloudbrainBenchmarkResourceSpecsMap[resourceSpecId], nil) | |||
} | |||
} else if clusterType == TypeCloudBrainTwo { | |||
switch jobType { | |||
case string(JobTypeDebug): | |||
return NewResourceAndFlavor(nil, ModelArtsDebugResourceSpecsMap[flavorCode]) | |||
case string(JobTypeTrain): | |||
return NewResourceAndFlavor(nil, ModelArtsTrainResourceSpecsMap[flavorCode]) | |||
case string(JobTypeInference): | |||
return NewResourceAndFlavor(nil, ModelArtsTrainResourceSpecsMap[flavorCode]) | |||
} | |||
} | |||
return nil | |||
} | |||
func GetCloudbrainTaskUnitPrice(task Cloudbrain) int64 { | |||
spec := GetCloudbrainResourceSpec(task.JobType, task.Type, task.ResourceSpecId, task.FlavorCode) | |||
if spec == nil { | |||
return 0 | |||
} | |||
if task.Type == TypeCloudBrainOne { | |||
if spec.ResourceSpec == nil { | |||
return 0 | |||
} | |||
return spec.ResourceSpec.UnitPrice | |||
} else if task.Type == TypeCloudBrainTwo { | |||
if spec.FlavorInfo == nil { | |||
return 0 | |||
} | |||
return spec.FlavorInfo.UnitPrice | |||
} | |||
return 0 | |||
} |
@@ -27,3 +27,11 @@ func valuesUser(m map[int64]*User) []*User { | |||
} | |||
return values | |||
} | |||
func valuesComment(m map[int64]*Comment) []*Comment { | |||
var values = make([]*Comment, 0, len(m)) | |||
for _, v := range m { | |||
values = append(values, v) | |||
} | |||
return values | |||
} |
@@ -50,18 +50,18 @@ func UpdateRewardAdminLogStatus(logId string, oldStatus, newStatus int) error { | |||
return nil | |||
} | |||
func GetRewardAdminLogByLogIds(logIds []string) ([]RewardAdminLog, error) { | |||
func GetRewardAdminLogByLogIds(logIds []string) ([]*RewardAdminLog, error) { | |||
if len(logIds) == 0 { | |||
return nil, nil | |||
} | |||
adminLogs := make([]AdminLogAndUser, 0) | |||
adminLogs := make([]*AdminLogAndUser, 0) | |||
err := x.Table("reward_admin_log").Join("LEFT", "user", "reward_admin_log.creator_id = public.user.id").In("reward_admin_log.log_id", logIds).Find(&adminLogs) | |||
if err != nil { | |||
return nil, err | |||
} | |||
r := make([]RewardAdminLog, len(adminLogs)) | |||
r := make([]*RewardAdminLog, len(adminLogs)) | |||
for i, v := range adminLogs { | |||
temp := v.AdminRewardAdminLog | |||
temp := &v.AdminRewardAdminLog | |||
temp.CreatorName = v.User.Name | |||
r[i] = temp | |||
} | |||
@@ -119,7 +119,6 @@ type RewardRecordShowList []*RewardOperateRecordShow | |||
func (l *RewardRecordList) ToShow() (RewardRecordShowList, error) { | |||
actionMap, err := l.GetRewardRecordAction() | |||
adminLogMap, err := l.GetRewardRecordAdminLog() | |||
CloudbrainMap, err := l.GetRewardRecordCloudbrainTask() | |||
if err != nil { | |||
return nil, err | |||
@@ -129,11 +128,9 @@ func (l *RewardRecordList) ToShow() (RewardRecordShowList, error) { | |||
temp := v.ToShow() | |||
switch v.SourceType { | |||
case SourceTypeAccomplishTask.Name(): | |||
temp.Action = actionMap[v.SourceId] | |||
case SourceTypeAdminOperate.Name(): | |||
temp.AdminLog = adminLogMap[v.SourceId] | |||
temp.Action = actionMap[v.SourceId].ToShow() | |||
case SourceTypeRunCloudbrainTask.Name(): | |||
temp.Cloudbrain = CloudbrainMap[v.SourceId] | |||
temp.Cloudbrain = CloudbrainMap[v.SourceId].ToShow() | |||
} | |||
result = append(result, &temp) | |||
} | |||
@@ -141,7 +138,7 @@ func (l *RewardRecordList) ToShow() (RewardRecordShowList, error) { | |||
return result, nil | |||
} | |||
func (l *RewardRecordList) GetRewardRecordAction() (map[string]Action, error) { | |||
func (l *RewardRecordList) GetRewardRecordAction() (map[string]*Action, error) { | |||
if len(*l) == 0 { | |||
return nil, nil | |||
} | |||
@@ -157,15 +154,15 @@ func (l *RewardRecordList) GetRewardRecordAction() (map[string]Action, error) { | |||
if err != nil { | |||
return nil, err | |||
} | |||
result := make(map[string]Action, 0) | |||
result := make(map[string]*Action, 0) | |||
for _, v := range actions { | |||
result[fmt.Sprint(v.ID)] = *v | |||
result[fmt.Sprint(v.ID)] = v | |||
} | |||
return result, nil | |||
} | |||
func (l *RewardRecordList) GetRewardRecordAdminLog() (map[string]RewardAdminLog, error) { | |||
func (l *RewardRecordList) GetRewardRecordAdminLog() (map[string]*RewardAdminLog, error) { | |||
if len(*l) == 0 { | |||
return nil, nil | |||
} | |||
@@ -180,7 +177,7 @@ func (l *RewardRecordList) GetRewardRecordAdminLog() (map[string]RewardAdminLog, | |||
if err != nil { | |||
return nil, err | |||
} | |||
result := make(map[string]RewardAdminLog, 0) | |||
result := make(map[string]*RewardAdminLog, 0) | |||
for _, v := range logs { | |||
result[fmt.Sprint(v.LogId)] = v | |||
} | |||
@@ -188,7 +185,7 @@ func (l *RewardRecordList) GetRewardRecordAdminLog() (map[string]RewardAdminLog, | |||
} | |||
func (l *RewardRecordList) GetRewardRecordCloudbrainTask() (map[string]Cloudbrain, error) { | |||
func (l *RewardRecordList) GetRewardRecordCloudbrainTask() (map[string]*Cloudbrain, error) { | |||
if len(*l) == 0 { | |||
return nil, nil | |||
} | |||
@@ -204,7 +201,7 @@ func (l *RewardRecordList) GetRewardRecordCloudbrainTask() (map[string]Cloudbrai | |||
if err != nil { | |||
return nil, err | |||
} | |||
result := make(map[string]Cloudbrain, 0) | |||
result := make(map[string]*Cloudbrain, 0) | |||
for _, v := range cloudbrains { | |||
result[fmt.Sprint(v.ID)] = v | |||
} | |||
@@ -242,7 +239,6 @@ type AdminRewardOperateReq struct { | |||
func (r RewardOperateRecord) ToShow() RewardOperateRecordShow { | |||
return RewardOperateRecordShow{ | |||
SerialNo: r.SerialNo, | |||
CreateDate: r.CreatedUnix, | |||
OperateType: r.OperateType, | |||
Amount: r.Amount, | |||
Remark: r.Remark, | |||
@@ -255,7 +251,6 @@ func (r RewardOperateRecord) ToShow() RewardOperateRecordShow { | |||
type RewardOperateRecordShow struct { | |||
SerialNo string | |||
CreateDate timeutil.TimeStamp | |||
Status string | |||
OperateType string | |||
Amount int64 | |||
@@ -263,9 +258,9 @@ type RewardOperateRecordShow struct { | |||
Remark string | |||
SourceType string | |||
LastOperateDate timeutil.TimeStamp | |||
Action Action | |||
Cloudbrain Cloudbrain | |||
AdminLog RewardAdminLog | |||
Action *ActionShow | |||
Cloudbrain *CloudbrainShow | |||
AdminLog *RewardAdminLog | |||
} | |||
func getPointOperateRecord(tl *RewardOperateRecord) (*RewardOperateRecord, error) { | |||
@@ -22,7 +22,6 @@ type CreateModelArtsNotebookForm struct { | |||
Description string `form:"description"` | |||
Flavor string `form:"flavor" binding:"Required"` | |||
ImageId string `form:"image_id" binding:"Required"` | |||
ResourceSpecId int `form:"resource_spec_id"` | |||
} | |||
func (f *CreateModelArtsNotebookForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { | |||
@@ -47,7 +46,6 @@ type CreateModelArtsTrainJobForm struct { | |||
VersionName string `form:"version_name" binding:"Required"` | |||
FlavorName string `form:"flaver_names" binding:"Required"` | |||
EngineName string `form:"engine_names" binding:"Required"` | |||
ResourceSpecId int `form:"resource_spec_id"` | |||
} | |||
type CreateModelArtsInferenceJobForm struct { | |||
@@ -73,7 +71,6 @@ type CreateModelArtsInferenceJobForm struct { | |||
ModelName string `form:"model_name" binding:"Required"` | |||
ModelVersion string `form:"model_version" binding:"Required"` | |||
CkptName string `form:"ckpt_name" binding:"Required"` | |||
ResourceSpecId int `form:"resource_spec_id"` | |||
} | |||
func (f *CreateModelArtsTrainJobForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { | |||
@@ -140,8 +140,9 @@ type VersionInfo struct { | |||
type Flavor struct { | |||
Info []struct { | |||
Code string `json:"code"` | |||
Value string `json:"value"` | |||
Code string `json:"code"` | |||
Value string `json:"value"` | |||
UnitPrice int64 `json:"unitPrice"` | |||
} `json:"flavor"` | |||
} | |||
@@ -230,7 +230,7 @@ func CloudBrainCreate(ctx *context.Context, form auth.CreateCloudBrainForm) { | |||
command = commandTrain | |||
} | |||
if !account.IsPointBalanceEnough(ctx.User.ID, jobType, resourceSpecId) { | |||
if !account.IsPointBalanceEnough(ctx.User.ID, jobType, models.TypeCloudBrainOne, resourceSpecId, "") { | |||
log.Error("point balance is not enough,userId=%d jobType=%s resourceSpecId=%d", ctx.User.ID, jobType, resourceSpecId) | |||
cloudBrainNewDataPrepare(ctx) | |||
ctx.RenderWithErr(models.ErrInsufficientPointsBalance{}.Error(), tpl, &form) | |||
@@ -318,7 +318,7 @@ func CloudBrainRestart(ctx *context.Context) { | |||
var status = string(models.JobWaiting) | |||
task := ctx.Cloudbrain | |||
for { | |||
if !account.IsPointBalanceEnough(ctx.User.ID, task.JobType, task.ResourceSpecId) { | |||
if !account.IsPointBalanceEnough(ctx.User.ID, task.JobType, models.TypeCloudBrainOne, task.ResourceSpecId, "") { | |||
log.Error("point balance is not enough,userId=%d jobType=%s resourceSpecId=%d", ctx.User.ID, task.JobType, task.ResourceSpecId) | |||
resultCode = "-1" | |||
errorMsg = models.ErrInsufficientPointsBalance{}.Error() | |||
@@ -1870,7 +1870,7 @@ func BenchMarkAlgorithmCreate(ctx *context.Context, form auth.CreateCloudBrainFo | |||
repo := ctx.Repo.Repository | |||
if !account.IsPointBalanceEnough(ctx.User.ID, string(models.JobTypeBenchmark), resourceSpecId) { | |||
if !account.IsPointBalanceEnough(ctx.User.ID, string(models.JobTypeBenchmark), models.TypeCloudBrainOne, cloudbrain.BenchMarkResourceID, "") { | |||
log.Error("point balance is not enough,userId=%d jobType=%s resourceSpecId=%d", ctx.User.ID, string(models.JobTypeBenchmark), resourceSpecId) | |||
cloudBrainNewDataPrepare(ctx) | |||
ctx.RenderWithErr(models.ErrInsufficientPointsBalance{}.Error(), tplCloudBrainBenchmarkNew, &form) | |||
@@ -2032,7 +2032,7 @@ func ModelBenchmarkCreate(ctx *context.Context, form auth.CreateCloudBrainForm) | |||
tpl := tplCloudBrainBenchmarkNew | |||
command := cloudbrain.Command | |||
if !account.IsPointBalanceEnough(ctx.User.ID, jobType, resourceSpecId) { | |||
if !account.IsPointBalanceEnough(ctx.User.ID, jobType, models.TypeCloudBrainOne, resourceSpecId, "") { | |||
log.Error("point balance is not enough,userId=%d jobType=%s resourceSpecId=%d", ctx.User.ID, jobType, resourceSpecId) | |||
cloudBrainNewDataPrepare(ctx) | |||
ctx.RenderWithErr(models.ErrInsufficientPointsBalance{}.Error(), tpl, &form) | |||
@@ -205,10 +205,9 @@ func Notebook2Create(ctx *context.Context, form auth.CreateModelArtsNotebookForm | |||
flavor := form.Flavor | |||
imageId := form.ImageId | |||
repo := ctx.Repo.Repository | |||
resourceSpecId := form.ResourceSpecId | |||
if !account.IsPointBalanceEnough(ctx.User.ID, string(models.JobTypeDebug), resourceSpecId) { | |||
log.Error("point balance is not enough,userId=%d jobType=%s resourceSpecId=%d", ctx.User.ID, string(models.JobTypeBenchmark), resourceSpecId) | |||
if !account.IsPointBalanceEnough(ctx.User.ID, string(models.JobTypeDebug), models.TypeCloudBrainTwo, 0, flavor) { | |||
log.Error("point balance is not enough,userId=%d jobType=%s ", ctx.User.ID, string(models.JobTypeBenchmark)) | |||
cloudBrainNewDataPrepare(ctx) | |||
ctx.RenderWithErr(models.ErrInsufficientPointsBalance{}.Error(), tplModelArtsNotebookNew, &form) | |||
return | |||
@@ -426,7 +425,7 @@ func NotebookManage(ctx *context.Context) { | |||
errorMsg = "you have no right to restart the job" | |||
break | |||
} | |||
if !account.IsPointBalanceEnough(ctx.User.ID, task.JobType, task.ResourceSpecId) { | |||
if !account.IsPointBalanceEnough(ctx.User.ID, task.JobType, task.Type, task.ResourceSpecId, task.FlavorCode) { | |||
log.Error("point balance is not enough,userId=%d jobType=%s resourceSpecId=%d", ctx.User.ID, task.JobType, task.ResourceSpecId) | |||
resultCode = "-1" | |||
errorMsg = models.ErrInsufficientPointsBalance{}.Error() | |||
@@ -1000,10 +999,9 @@ func TrainJobCreate(ctx *context.Context, form auth.CreateModelArtsTrainJobForm) | |||
FlavorName := form.FlavorName | |||
VersionCount := modelarts.VersionCount | |||
EngineName := form.EngineName | |||
resourceSpecId := form.ResourceSpecId | |||
if !account.IsPointBalanceEnough(ctx.User.ID, string(models.JobTypeTrain), resourceSpecId) { | |||
log.Error("point balance is not enough,userId=%d jobType=%s resourceSpecId=%d", ctx.User.ID, string(models.JobTypeBenchmark), resourceSpecId) | |||
if !account.IsPointBalanceEnough(ctx.User.ID, string(models.JobTypeTrain), models.TypeCloudBrainTwo, 0, flavorCode) { | |||
log.Error("point balance is not enough,userId=%d jobType=%s", ctx.User.ID, string(models.JobTypeBenchmark)) | |||
cloudBrainNewDataPrepare(ctx) | |||
ctx.RenderWithErr(models.ErrInsufficientPointsBalance{}.Error(), tplModelArtsTrainJobNew, &form) | |||
return | |||
@@ -1183,7 +1181,6 @@ func TrainJobCreate(ctx *context.Context, form auth.CreateModelArtsTrainJobForm) | |||
EngineName: EngineName, | |||
VersionCount: VersionCount, | |||
TotalVersionCount: modelarts.TotalVersionCount, | |||
ResourceSpecId: resourceSpecId, | |||
} | |||
//将params转换Parameters.Parameter,出错时返回给前端 | |||
@@ -1847,12 +1844,11 @@ func InferenceJobCreate(ctx *context.Context, form auth.CreateModelArtsInference | |||
modelName := form.ModelName | |||
modelVersion := form.ModelVersion | |||
ckptName := form.CkptName | |||
resourceSpecId := form.ResourceSpecId | |||
ckptUrl := form.TrainUrl + form.CkptName | |||
if !account.IsPointBalanceEnough(ctx.User.ID, string(models.JobTypeInference), resourceSpecId) { | |||
log.Error("point balance is not enough,userId=%d jobType=%s resourceSpecId=%d", ctx.User.ID, string(models.JobTypeBenchmark), resourceSpecId) | |||
if !account.IsPointBalanceEnough(ctx.User.ID, string(models.JobTypeInference), models.TypeCloudBrainTwo, 0, flavorCode) { | |||
log.Error("point balance is not enough,userId=%d jobType=%s ", ctx.User.ID, string(models.JobTypeBenchmark)) | |||
inferenceJobErrorNewDataPrepare(ctx, form) | |||
ctx.RenderWithErr(models.ErrInsufficientPointsBalance{}.Error(), tplModelArtsInferenceJobNew, &form) | |||
return | |||
@@ -2002,7 +1998,6 @@ func InferenceJobCreate(ctx *context.Context, form auth.CreateModelArtsInference | |||
ModelVersion: modelVersion, | |||
CkptName: ckptName, | |||
ResultUrl: resultObsPath, | |||
ResourceSpecId: resourceSpecId, | |||
} | |||
err = modelarts.GenerateInferenceJob(ctx, req) | |||
@@ -20,9 +20,9 @@ func StartAndGetCloudBrainPointDeductTask(task models.Cloudbrain) (*models.Rewar | |||
return nil, nil | |||
} | |||
spec := models.GetResourceSpec(task.JobType, task.ResourceSpecId) | |||
if spec == nil || spec.UnitPrice == 0 { | |||
log.Debug("GetResourceSpec failed,spec is nil or UnitPrice = 0") | |||
unitPrice := models.GetCloudbrainTaskUnitPrice(task) | |||
if unitPrice == 0 { | |||
log.Debug("finish StartAndGetCloudBrainPointDeductTask, UnitPrice = 0 task.ID=%d", task.ID) | |||
return nil, nil | |||
} | |||
@@ -34,7 +34,7 @@ func StartAndGetCloudBrainPointDeductTask(task models.Cloudbrain) (*models.Rewar | |||
OperateType: models.OperateTypeDecrease, | |||
Delay: setting.CloudBrainPayDelay, | |||
Interval: setting.CloudBrainPayInterval, | |||
UnitAmount: spec.UnitPrice, | |||
UnitAmount: unitPrice, | |||
RewardType: models.RewardTypePoint, | |||
StartTime: time.Unix(int64(task.StartTime), 0), | |||
Tittle: RUN_CLOUDBRAIN_TASK_TITTLE, | |||
@@ -67,12 +67,18 @@ func InitAccount(userId int64) (*models.PointAccount, error) { | |||
} | |||
//IsPointBalanceEnough check whether the user's point balance is bigger than task unit price | |||
func IsPointBalanceEnough(targetUserId int64, jobType string, resourceSpecId int) bool { | |||
func IsPointBalanceEnough(targetUserId int64, jobType string, clusterType int, resourceSpecId int, flavorCode string) bool { | |||
if !setting.CloudBrainPaySwitch { | |||
return true | |||
} | |||
spec := models.GetResourceSpec(jobType, resourceSpecId) | |||
if spec == nil { | |||
t := models.Cloudbrain{ | |||
Type: clusterType, | |||
JobType: jobType, | |||
ResourceSpecId: resourceSpecId, | |||
FlavorCode: flavorCode, | |||
} | |||
uniPrice := models.GetCloudbrainTaskUnitPrice(t) | |||
if uniPrice == 0 { | |||
return true | |||
} | |||
a, err := GetAccount(targetUserId) | |||
@@ -80,6 +86,6 @@ func IsPointBalanceEnough(targetUserId int64, jobType string, resourceSpecId int | |||
log.Error("IsPointBalanceEnough GetAccount error,err=%v", err) | |||
return false | |||
} | |||
return a.Balance >= spec.UnitPrice | |||
return a.Balance >= uniPrice | |||
} |
@@ -9,19 +9,13 @@ import ( | |||
) | |||
func Accomplish(action models.Action) { | |||
action.OpType = models.GetTaskOptType(action) | |||
switch action.OpType { | |||
case models.ActionCreateRepo, | |||
models.ActionCreateImage: | |||
if action.Repo.IsPrivate { | |||
return | |||
} | |||
case models.ActionCreateDebugGPUTask, | |||
models.ActionCreateDebugNPUTask, | |||
models.ActionCreateTrainTask, | |||
models.ActionCreateInferenceTask, | |||
models.ActionCreateBenchMarkTask, | |||
models.ActionCreateGPUTrainTask: | |||
action.OpType = models.ActionCreateCloudbrainTask | |||
} | |||
go accomplish(action) | |||
} | |||