@@ -713,12 +713,14 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1 | |||
github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= | |||
github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= | |||
github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= | |||
github.com/smartystreets/assertions v1.1.0 h1:MkTeG1DMwsrdH7QtLXy5W+fUxWq+vmb6cLmyJ7aRtF0= | |||
github.com/smartystreets/assertions v1.1.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= | |||
github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM= | |||
github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= | |||
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= | |||
github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 h1:WN9BUFbdyOsSH/XohnWpXOlq9NBD5sGAB2FciQMUEe8= | |||
github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= | |||
github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= | |||
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= | |||
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= | |||
github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= | |||
@@ -31,9 +31,9 @@ const ( | |||
) | |||
const ( | |||
NPUResource = "NPU" | |||
GPUResource = "CPU/GPU" | |||
AllResource = "all" | |||
NPUResource = "NPU" | |||
GPUResource = "CPU/GPU" | |||
AllResource = "all" | |||
//notebook storage category | |||
EVSCategory = "EVS" | |||
@@ -2174,7 +2174,18 @@ func GetDatasetInfo(uuidStr string) (map[string]DatasetInfo, string, error) { | |||
log.Error("GetAttachmentsByUUIDs failed: %v", err) | |||
return nil, datasetNames, err | |||
} | |||
for i, attach := range attachs { | |||
for i, tmpUuid := range uuids { | |||
var attach *Attachment | |||
for _, tmpAttach := range attachs { | |||
if tmpAttach.UUID == tmpUuid { | |||
attach = tmpAttach | |||
break | |||
} | |||
} | |||
if attach == nil { | |||
log.Error("GetAttachmentsByUUIDs failed: %v", err) | |||
return nil, datasetNames, err | |||
} | |||
fileName := strings.TrimSuffix(strings.TrimSuffix(strings.TrimSuffix(attach.Name, ".zip"), ".tar.gz"), ".tgz") | |||
for _, datasetInfo := range datasetInfos { | |||
if fileName == datasetInfo.Name { | |||
@@ -518,6 +518,10 @@ func UpdateLocalImageStatus(image *Image) error { | |||
return err | |||
} | |||
func UpdateAutoIncrementIndex() { | |||
x.Exec("SELECT setval('image_id_seq', (SELECT MAX(id) from image))") | |||
} | |||
func DeleteLocalImage(id int64) error { | |||
image := new(Image) | |||
_, err := x.ID(id).Delete(image) | |||
@@ -590,3 +590,13 @@ func GetTeamDatasetIdsByUserID(userID int64) []int64 { | |||
Cols("dataset.id").Find(&datasets) | |||
return datasets | |||
} | |||
func UpdateDatasetCreateUser(ID int64, user *User) error { | |||
_, err := x.Where("id = ?", ID).Cols("user_id").Update(&Dataset{ | |||
UserID: user.ID, | |||
}) | |||
if err != nil { | |||
return err | |||
} | |||
return nil | |||
} |
@@ -77,7 +77,10 @@ func (CloudbrainStopMsg) ShouldSend(ctx *TemplateContext) bool { | |||
} | |||
for _, v := range setting.CloudbrainStoppedNotifyList { | |||
if v == ctx.Cloudbrain.JobType { | |||
return true | |||
if ctx.Cloudbrain.Duration > 0 && ctx.Cloudbrain.EndTime > 0 { | |||
return true | |||
} | |||
break | |||
} | |||
} | |||
return false | |||
@@ -24,10 +24,11 @@ var ( | |||
) | |||
const ( | |||
JobHasBeenStopped = "S410" | |||
Public = "public" | |||
Custom = "custom" | |||
LogPageSize = 500 | |||
JobHasBeenStopped = "S410" | |||
errInvalidToken = "S401" | |||
Public = "public" | |||
Custom = "custom" | |||
LogPageSize = 500 | |||
LogPageTokenExpired = "5m" | |||
pageSize = 15 | |||
QueuesDetailUrl = "/rest-server/api/v2/queuesdetail" | |||
@@ -59,7 +60,7 @@ func loginCloudbrain() error { | |||
res, err := client.R(). | |||
SetHeader("Content-Type", "application/json"). | |||
SetBody(map[string]interface{}{"username": username, "password": password, "expiration": "604800"}). | |||
SetBody(map[string]interface{}{"username": username, "password": password, "expiration": conf.Expiration}). | |||
SetResult(&loginResult). | |||
Post(HOST + "/rest-server/api/v1/token") | |||
if err != nil { | |||
@@ -122,16 +123,12 @@ sendjob: | |||
Post(HOST + "/rest-server/api/v1/jobs/") | |||
if err != nil { | |||
if res != nil { | |||
var response models.CloudBrainResult | |||
json.Unmarshal(res.Body(), &response) | |||
log.Error("code(%s), msg(%s)", response.Code, response.Msg) | |||
return nil, fmt.Errorf(response.Msg) | |||
} | |||
return nil, fmt.Errorf("resty create job: %s", err) | |||
} | |||
if jobResult.Code == "S401" && retry < 1 { | |||
var response models.CloudBrainResult | |||
json.Unmarshal(res.Body(), &response) | |||
if response.Code == errInvalidToken && retry < 1 { | |||
retry++ | |||
_ = loginCloudbrain() | |||
goto sendjob | |||
@@ -163,7 +160,9 @@ sendjob: | |||
return nil, fmt.Errorf("resty GetJob: %v", err) | |||
} | |||
if getJobResult.Code == "S401" && retry < 1 { | |||
var response models.CloudBrainResult | |||
json.Unmarshal(res.Body(), &response) | |||
if response.Code == errInvalidToken && retry < 1 { | |||
retry++ | |||
_ = loginCloudbrain() | |||
goto sendjob | |||
@@ -196,13 +195,8 @@ sendjob: | |||
} | |||
var response models.CloudBrainResult | |||
err = json.Unmarshal(res.Body(), &response) | |||
if err != nil { | |||
log.Error("json.Unmarshal failed: %s", err.Error()) | |||
return &getImagesResult, fmt.Errorf("json.Unmarshal failed: %s", err.Error()) | |||
} | |||
if response.Code == "S401" && retry < 1 { | |||
json.Unmarshal(res.Body(), &response) | |||
if response.Code == errInvalidToken && retry < 1 { | |||
retry++ | |||
_ = loginCloudbrain() | |||
goto sendjob | |||
@@ -290,7 +284,9 @@ sendjob: | |||
return fmt.Errorf("resty CommitImage: %v", err) | |||
} | |||
if result.Code == "S401" && retry < 1 { | |||
var response models.CloudBrainResult | |||
json.Unmarshal(res.Body(), &response) | |||
if response.Code == errInvalidToken && retry < 1 { | |||
retry++ | |||
_ = loginCloudbrain() | |||
goto sendjob | |||
@@ -312,6 +308,7 @@ sendjob: | |||
} | |||
err = models.WithTx(func(ctx models.DBContext) error { | |||
models.UpdateAutoIncrementIndex() | |||
if dbImage != nil { | |||
dbImage.IsPrivate = params.IsPrivate | |||
dbImage.Description = params.ImageDescription | |||
@@ -441,7 +438,9 @@ sendjob: | |||
return fmt.Errorf("resty StopJob: %v", err) | |||
} | |||
if result.Code == "S401" && retry < 1 { | |||
var response models.CloudBrainResult | |||
json.Unmarshal(res.Body(), &response) | |||
if response.Code == errInvalidToken && retry < 1 { | |||
retry++ | |||
_ = loginCloudbrain() | |||
goto sendjob | |||
@@ -497,7 +496,7 @@ func GetJobAllLog(scrollID string) (*models.GetJobLogResult, error) { | |||
client := getRestyClient() | |||
var result models.GetJobLogResult | |||
req := models.GetAllJobLogParams{ | |||
Scroll: LogPageTokenExpired, | |||
Scroll: LogPageTokenExpired, | |||
ScrollID: scrollID, | |||
} | |||
@@ -521,7 +520,7 @@ func GetJobAllLog(scrollID string) (*models.GetJobLogResult, error) { | |||
return &result, nil | |||
} | |||
func DeleteJobLogToken(scrollID string) (error) { | |||
func DeleteJobLogToken(scrollID string) error { | |||
checkSetting() | |||
client := getRestyClient() | |||
var result models.DeleteJobLogTokenResult | |||
@@ -23,9 +23,7 @@ const ( | |||
NpuWorkDir = "/cache/" | |||
CommandPrepareScript = ";mkdir -p output;mkdir -p code;mkdir -p dataset;echo \"start loading script\";wget -q https://git.openi.org.cn/OpenIOSSG/script_for_grampus/archive/master.zip;" + | |||
"echo \"finish loading script\";unzip -q master.zip;cd script_for_grampus;chmod 777 downloader_for_obs uploader_for_obs downloader_for_minio uploader_for_minio;" | |||
//CommandPrepareScript = "pwd;cd /cache;mkdir -p output;mkdir -p code;mkdir -p dataset;echo \"start loading script\";wget -q https://git.openi.org.cn/OpenIOSSG/script_for_grampus/archive/master.zip;" + | |||
// "echo \"finish loading script\";unzip -q master.zip;cd script_for_grampus;chmod 777 downloader_for_obs uploader_for_obs downloader_for_minio uploader_for_minio;" | |||
"echo \"finish loading script\";unzip -q master.zip;cd script_for_grampus;chmod 777 downloader_for_obs uploader_for_npu downloader_for_minio uploader_for_gpu;" | |||
CodeArchiveName = "master.zip" | |||
) | |||
@@ -134,6 +134,7 @@ type GenerateInferenceJobReq struct { | |||
ModelVersion string | |||
CkptName string | |||
ResultUrl string | |||
DatasetName string | |||
} | |||
type VersionInfo struct { | |||
@@ -690,11 +691,11 @@ func GenerateInferenceJob(ctx *context.Context, req *GenerateInferenceJobReq) (e | |||
return err | |||
} | |||
attach, err := models.GetAttachmentByUUID(req.Uuid) | |||
if err != nil { | |||
log.Error("GetAttachmentByUUID(%s) failed:%v", strconv.FormatInt(jobResult.JobID, 10), err.Error()) | |||
return err | |||
} | |||
// attach, err := models.GetAttachmentByUUID(req.Uuid) | |||
// if err != nil { | |||
// log.Error("GetAttachmentByUUID(%s) failed:%v", strconv.FormatInt(jobResult.JobID, 10), err.Error()) | |||
// return err | |||
// } | |||
jobID := strconv.FormatInt(jobResult.JobID, 10) | |||
err = models.CreateCloudbrain(&models.Cloudbrain{ | |||
Status: TransTrainJobStatus(jobResult.Status), | |||
@@ -708,7 +709,7 @@ func GenerateInferenceJob(ctx *context.Context, req *GenerateInferenceJobReq) (e | |||
VersionID: jobResult.VersionID, | |||
VersionName: jobResult.VersionName, | |||
Uuid: req.Uuid, | |||
DatasetName: attach.Name, | |||
DatasetName: req.DatasetName, | |||
CommitID: req.CommitID, | |||
EngineID: req.EngineID, | |||
TrainUrl: req.TrainUrl, | |||
@@ -5,6 +5,7 @@ type CloudbrainLoginConfig struct { | |||
Password string | |||
Host string | |||
ImageURLPrefix string | |||
Expiration string | |||
} | |||
var ( | |||
@@ -17,5 +18,6 @@ func GetCloudbrainConfig() CloudbrainLoginConfig { | |||
Cloudbrain.Password = cloudbrainSec.Key("PASSWORD").MustString("") | |||
Cloudbrain.Host = cloudbrainSec.Key("REST_SERVER_HOST").MustString("") | |||
Cloudbrain.ImageURLPrefix = cloudbrainSec.Key("IMAGE_URL_PREFIX").MustString("") | |||
Cloudbrain.Expiration = cloudbrainSec.Key("EXPIRATION").MustString("604800") | |||
return Cloudbrain | |||
} |
@@ -254,13 +254,15 @@ page_dev_env_desc2_desc=Associate the model with the code version, you can adjus | |||
page_dev_env_desc3_title=Once Configuration, Multiple Reuse | |||
page_dev_env_desc3_desc=Provide execution environment sharing, Once Configuration, Multiple Reuse. Lower the threshold of model development, and avoid spending repetitive time configuring complex environments. | |||
page_dev_yunlao=OpenI AI Collaboration Platform | |||
page_dev_yunlao_desc1=OpenI AI collaboration platform has cooperated with Pengcheng cloud brain and China computing power network (c ² Net) can be used to complete AI development tasks by using the rich computing resources of Pengcheng cloud brain and China computing network. | |||
page_dev_yunlao_desc1=OpenI AI collaboration platform has cooperated with Pengcheng cloud brain and China computing power network (C²NET) can be used to complete AI development tasks by using the rich computing resources of Pengcheng cloud brain and China computing network. | |||
page_dev_yunlao_desc2=Pengcheng CloudBrain's existing AI computing power is 100p FLOPS@FP16 (billions of half precision floating-point calculations per second), the main hardware infrastructure consists of GPU servers equipped with NVIDIA Tesla V100 and A100, and Atlas 900 AI clusters equipped with Kunpeng and shengteng processors. | |||
page_dev_yunlao_desc3=China computing power network (c ² Net) phase I can realize high-speed network interconnection between different artificial intelligence computing centers, and realize reasonable scheduling of computing power and flexible allocation of resources. At present, 11 intelligent computing centers have been connected, and the total scale of computing power is 1924p OPS@FP16 。 Qizhi AI collaboration platform has been connected to Pengcheng Cloud Computing Institute, Chengdu Intelligent Computing Center, Zhongyuan Intelligent Computing Center, Hefei brain and other nodes. | |||
page_dev_yunlao_desc3=China computing power network (C²NET) phase I can realize high-speed network interconnection between different artificial intelligence computing centers, and realize reasonable scheduling of computing power and flexible allocation of resources. At present, 11 intelligent computing centers have been connected, and the total scale of computing power is 1924p OPS@FP16. OpenI AI collaboration platform has been connected to Pengcheng Cloud Computing Institute, Chengdu Intelligent Computing Center, Zhongyuan Intelligent Computing Center, Hefei brain and other nodes. | |||
page_dev_yunlao_desc4=Developers can freely select the corresponding computing resources according to the use needs, and can test the adaptability, performance, stability, etc. of the model in different hardware environments. | |||
page_dev_yunlao_desc5=If your model requires more computing resources, you can also apply for it separately. | |||
page_dev_yunlao_apply=Apply Separately | |||
c2net_title=C²NET | |||
c2net_desc=The artificial intelligence computing power network promotion alliance has access to 11 intelligent computing centers, with a total scale of 1924p. | |||
c2net_center=Center | |||
search=Search | |||
search_repo=Repository | |||
search_dataset=DataSet | |||
@@ -823,6 +825,8 @@ title_format_err=Name can only contain number,letter,'-','_' or '.', and can be | |||
description = Description | |||
description_format_err=Description's length can be up to %s characters long. | |||
create_dataset = Create Dataset | |||
download_url=Download Url | |||
download_oper=Operation | |||
create_dataset_fail=Failed to create dataset. | |||
query_dataset_fail=Failed to query dataset. | |||
edit_attachment_fail=Failed to update description. | |||
@@ -1102,7 +1106,8 @@ modelarts.status=Status | |||
modelarts.createtime=CreateTime | |||
modelarts.version_nums = Version Nums | |||
modelarts.version = Version | |||
modelarts.computing_resources=compute Resources | |||
modelarts.computing_resources=Compute Resources | |||
modelarts.cluster.computing_resources=Cluster/Compute Resources | |||
modelarts.ai_center=Ai Center | |||
modelarts.card_type=Card Type | |||
modelarts.cluster=Cluster | |||
@@ -2993,15 +2998,15 @@ mirror_sync_delete = synced and deleted reference <code>%[2]s</code> at <a href= | |||
approve_pull_request = `approved <a href="%s/pulls/%s">%s#%[2]s</a>` | |||
reject_pull_request = `suggested changes for <a href="%s/pulls/%s">%s#%[2]s</a>` | |||
upload_dataset=`upload dataset <a href="%s/datasets">%s</a>` | |||
task_gpudebugjob=`created CPU/GPU type debugging task<a href="%s/cloudbrain/%s">%s</a>` | |||
task_gpudebugjob=`created CPU/GPU type debugging task <a href="%s/cloudbrain/%s">%s</a>` | |||
task_npudebugjob=`created NPU type debugging task <a href="%s/modelarts/notebook/%s">%s</a>` | |||
task_nputrainjob=`created NPU training task<a href="%s/modelarts/train-job/%s">%s</a>` | |||
task_nputrainjob=`created NPU training task <a href="%s/modelarts/train-job/%s">%s</a>` | |||
task_inferencejob=`created reasoning task <a href="%s/modelarts/inference-job/%s">%s</a>` | |||
task_benchmark=`created profiling task <a href="%s/cloudbrain/benchmark/%s">%s</a>` | |||
task_createmodel=`created new model <a href="%s/modelmanage/show_model_info?name=%s">%s</a>` | |||
task_gputrainjob=`created CPU/GPU training task<a href="%s/cloudbrain/train-job/%s">%s</a>` | |||
task_c2netnputrainjob=`created NPU training task<a href="%s/grampus/train-job/%s">%s</a>` | |||
task_c2netgputrainjob=`created CPU/GPU training task<a href="%s/grampus/train-job/%s">%s</a>` | |||
task_gputrainjob=`created CPU/GPU training task <a href="%s/cloudbrain/train-job/%s">%s</a>` | |||
task_c2netnputrainjob=`created NPU training task <a href="%s/grampus/train-job/%s">%s</a>` | |||
task_c2netgputrainjob=`created CPU/GPU training task <a href="%s/grampus/train-job/%s">%s</a>` | |||
[tool] | |||
ago = %s ago | |||
@@ -3095,6 +3100,8 @@ all_ai_center=All Computing NET | |||
resource_cluster = Resource Cluster | |||
resource_cluster_openi = OpenI Resource Cluster | |||
resource_cluster_c2net = China Computing NET | |||
resource_cluster_openi_simple = OpenI | |||
resource_cluster_c2net_simple = C²NET | |||
compute_resource = Computing resources | |||
task_name = Task name | |||
task_type = Task type | |||
@@ -3119,7 +3126,8 @@ wrong_specification=You cannot use this specification, please choose another ite | |||
job_name_rule = Please enter letters, numbers, _ and - up to 64 characters and cannot end with a dash (-). | |||
dataset_path_rule = The dataset location is stored in the environment variable data_url, and the training output path is stored in the environment variable train_url. | |||
train_dataset_path_rule = The dataset location is stored in the environment variable <strong style="color:#010101">data_url</strong>, and the output path is stored in the environment variable <strong style="color:#010101">train_url</strong>. | |||
infer_dataset_path_rule = The dataset location is stored in the environment variable <strong style="color:#010101">data_url</strong>, and the output path is stored in the environment variable <strong style="color:#010101">train_url</strong>. | |||
view_sample = View sample | |||
inference_output_path_rule = The inference output path is stored in the environment variable result_url. | |||
model_file_path_rule=The model file location is stored in the environment variable ckpt_url | |||
@@ -3152,3 +3160,4 @@ Stopped_success_update_status_fail=Succeed in stopping th job, but failed to upd | |||
load_code_failed=Fail to load code, please check if the right branch is selected. | |||
error.dataset_select = dataset select error:the count exceed the limit or has same name | |||
new_train_gpu_tooltips = The code is storaged in <strong style="color:#010101">%s</strong>, the dataset is storaged in <strong style="color:#010101">%s</strong>, and please put your model into <strong style="color:#010101">%s</strong> then you can download it online |
@@ -262,7 +262,9 @@ page_dev_yunlao_desc3=中国算力网(C²NET)一期可实现不同人工智 | |||
page_dev_yunlao_desc4=开发者可以根据使用需求,自由选择相应计算资源,可以测试模型在不同硬件环境下的适配能力、性能、稳定性等。 | |||
page_dev_yunlao_desc5=如果您的模型需要更多的计算资源,也可以单独申请。 | |||
page_dev_yunlao_apply=单独申请 | |||
c2net_title=智算网络 | |||
c2net_desc=人工智能算力网络推进联盟已接入11家智算中心,算力总规模1924P | |||
c2net_center=中心 | |||
search=搜索 | |||
search_repo=项目 | |||
search_dataset=数据集 | |||
@@ -831,9 +833,12 @@ create_dataset=创建数据集 | |||
create_dataset_fail=创建数据集失败。 | |||
query_dataset_fail=查询数据集失败。 | |||
edit_attachment_fail=修改描述失败。 | |||
reference_dataset_fail=关联数据集失败,请稍后再试。 | |||
cancel_reference_dataset_fail=取消关联数据集失败,请稍后再试。 | |||
download_url=数据集下载地址 | |||
download_oper=操作 | |||
show_dataset=数据集 | |||
edit_dataset=编辑数据集 | |||
update_dataset=更新数据集 | |||
@@ -1113,6 +1118,7 @@ modelarts.deletetime=删除时间 | |||
modelarts.version_nums=版本数 | |||
modelarts.version=版本 | |||
modelarts.computing_resources=计算资源 | |||
modelarts.cluster.computing_resources=集群/计算资源 | |||
modelarts.ai_center=智算中心 | |||
modelarts.card_type=卡类型 | |||
modelarts.cluster=集群 | |||
@@ -3109,6 +3115,8 @@ all_ai_center=全部智算中心 | |||
resource_cluster = 算力集群 | |||
resource_cluster_openi = 启智集群 | |||
resource_cluster_c2net = 智算网络集群 | |||
resource_cluster_openi_simple = 启智 | |||
resource_cluster_c2net_simple = 智算网络 | |||
compute_resource = 计算资源 | |||
task_name = 任务名称 | |||
task_type = 任务类型 | |||
@@ -3134,7 +3142,8 @@ card_type = 卡类型 | |||
wrong_specification=您目前不能使用这个资源规格,请选择其他资源规格。 | |||
job_name_rule = 请输入字母、数字、_和-,最长64个字符,且不能以中划线(-)结尾。 | |||
dataset_path_rule = 数据集位置存储在环境变量data_url中,训练输出路径存储在环境变量train_url中。 | |||
train_dataset_path_rule = 数据集位置存储在环境变量<strong style="color:#010101">data_url</strong>中,训练输出路径存储在环境变量<strong style="color:#010101">train_url</strong>中。 | |||
infer_dataset_path_rule = 数据集位置存储在环境变量<strong style="color:#010101">data_url</strong>中,推理输出路径存储在环境变量<strong style="color:#010101">train_url</strong>中。 | |||
view_sample = 查看样例 | |||
inference_output_path_rule = 推理输出路径存储在环境变量result_url中。 | |||
model_file_path_rule = 模型文件位置存储在环境变量ckpt_url中。 | |||
@@ -3168,3 +3177,4 @@ load_code_failed=代码加载失败,请确认选择了正确的分支。 | |||
error.dataset_select = 数据集选择错误:数量超过限制或者有同名数据集 | |||
new_train_gpu_tooltips =训练脚本存储在<strong style="color:#010101">%s</strong>中,数据集存储在<strong style="color:#010101">%s</strong>中,训练输出请存储在<strong style="color:#010101">%s</strong>中以供后续下载。 |
@@ -916,6 +916,7 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
m.Group("/cloudbrain", func() { | |||
m.Get("/:id", repo.GetCloudbrainTask) | |||
m.Get("/:id/log", repo.CloudbrainGetLog) | |||
m.Get("/:id/download_log_file", repo.CloudbrainDownloadLogFile) | |||
m.Group("/train-job", func() { | |||
m.Group("/:jobid", func() { | |||
m.Get("", repo.GetModelArtsTrainJobVersion) | |||
@@ -6,13 +6,17 @@ | |||
package repo | |||
import ( | |||
"code.gitea.io/gitea/modules/notification" | |||
"bufio" | |||
"encoding/json" | |||
"io" | |||
"net/http" | |||
"os" | |||
"sort" | |||
"strings" | |||
"time" | |||
"code.gitea.io/gitea/modules/notification" | |||
"code.gitea.io/gitea/modules/setting" | |||
"code.gitea.io/gitea/models" | |||
@@ -366,7 +370,7 @@ func CloudbrainForModelConvertGetLog(ctx *context.Context) { | |||
ctx.JSON(http.StatusOK, result) | |||
} | |||
func CloudbrainGetLog(ctx *context.Context) { | |||
func CloudbrainDownloadLogFile(ctx *context.Context) { | |||
ID := ctx.Params(":id") | |||
job, err := models.GetCloudbrainByID(ID) | |||
if err != nil { | |||
@@ -374,14 +378,124 @@ func CloudbrainGetLog(ctx *context.Context) { | |||
ctx.ServerError(err.Error(), err) | |||
return | |||
} | |||
prefix := "/" + setting.CBCodePathPrefix + job.JobName + "/model" | |||
files, err := storage.GetOneLevelAllObjectUnderDirMinio(setting.Attachment.Minio.Bucket, prefix, "") | |||
if err != nil { | |||
log.Error("query cloudbrain model failed: %v", err) | |||
return | |||
} | |||
fileName := "" | |||
for _, file := range files { | |||
if strings.HasSuffix(file.FileName, "log.txt") { | |||
fileName = file.FileName | |||
break | |||
} | |||
} | |||
if fileName != "" { | |||
url, err := storage.Attachments.PresignedGetURL(prefix+"/"+fileName, fileName) | |||
if err != nil { | |||
log.Error("Get minio get SignedUrl failed: %v", err.Error(), ctx.Data["msgID"]) | |||
ctx.ServerError("Get minio get SignedUrl failed", err) | |||
return | |||
} | |||
http.Redirect(ctx.Resp, ctx.Req.Request, url, http.StatusMovedPermanently) | |||
} | |||
} | |||
result := CloudbrainGetLogByJobId(job.JobID, job.JobName) | |||
func CloudbrainGetLog(ctx *context.Context) { | |||
ID := ctx.Params(":id") | |||
startLine := ctx.QueryInt("base_line") | |||
lines := ctx.QueryInt("lines") | |||
endLine := startLine + lines | |||
order := ctx.Query("order") | |||
if order == "asc" { | |||
endLine = startLine | |||
startLine = endLine - lines | |||
if startLine < 0 { | |||
startLine = 0 | |||
} | |||
} | |||
job, err := models.GetCloudbrainByID(ID) | |||
if err != nil { | |||
log.Error("GetCloudbrainByJobName failed: %v", err, ctx.Data["MsgID"]) | |||
ctx.ServerError(err.Error(), err) | |||
return | |||
} | |||
result := getLogFromModelDir(job.JobName, startLine, endLine) | |||
if result == nil { | |||
log.Error("GetJobLog failed: %v", err, ctx.Data["MsgID"]) | |||
ctx.ServerError(err.Error(), err) | |||
return | |||
} | |||
ctx.JSON(http.StatusOK, result) | |||
re := map[string]interface{}{ | |||
"JobID": ID, | |||
"LogFileName": result["FileName"], | |||
"StartLine": startLine, | |||
"EndLine": result["endLine"], | |||
"Content": result["Content"], | |||
"Lines": result["lines"], | |||
"CanLogDownload": result["FileName"] != "", | |||
} | |||
//result := CloudbrainGetLogByJobId(job.JobID, job.JobName) | |||
ctx.JSON(http.StatusOK, re) | |||
} | |||
func getLogFromModelDir(jobName string, startLine int, endLine int) map[string]interface{} { | |||
prefix := "/" + setting.CBCodePathPrefix + jobName + "/model" | |||
files, err := storage.GetOneLevelAllObjectUnderDirMinio(setting.Attachment.Minio.Bucket, prefix, "") | |||
if err != nil { | |||
log.Error("query cloudbrain model failed: %v", err) | |||
return nil | |||
} | |||
re := "" | |||
fileName := "" | |||
count := 0 | |||
fileEndLine := endLine | |||
for _, file := range files { | |||
if strings.HasSuffix(file.FileName, "log.txt") { | |||
fileName = file.FileName | |||
path := storage.GetMinioPath(jobName+"/model/", file.FileName) | |||
log.Info("path=" + path) | |||
reader, err := os.Open(path) | |||
defer reader.Close() | |||
if err == nil { | |||
r := bufio.NewReader(reader) | |||
for i := 0; i < endLine; i++ { | |||
line, error := r.ReadString('\n') | |||
log.Info("line=" + line) | |||
fileEndLine = i | |||
if error == io.EOF { | |||
log.Info("read file completed.") | |||
break | |||
} | |||
if error != nil { | |||
log.Info("read file error." + error.Error()) | |||
break | |||
} | |||
if error == nil { | |||
if i >= startLine { | |||
re = re + line | |||
count++ | |||
} | |||
} | |||
} | |||
} else { | |||
log.Info("error:" + err.Error()) | |||
} | |||
break | |||
} | |||
} | |||
return map[string]interface{}{ | |||
"JobName": jobName, | |||
"Content": re, | |||
"FileName": fileName, | |||
"lines": count, | |||
"endLine": fileEndLine, | |||
} | |||
} | |||
func CloudBrainModelConvertList(ctx *context.APIContext) { | |||
@@ -6,13 +6,14 @@ | |||
package repo | |||
import ( | |||
"code.gitea.io/gitea/modules/notification" | |||
"encoding/json" | |||
"net/http" | |||
"path" | |||
"strconv" | |||
"strings" | |||
"code.gitea.io/gitea/modules/notification" | |||
"code.gitea.io/gitea/modules/grampus" | |||
"code.gitea.io/gitea/modules/setting" | |||
@@ -352,6 +353,14 @@ func DelTrainJobVersion(ctx *context.APIContext) { | |||
return | |||
} | |||
if task.Status != string(models.ModelArtsTrainJobImageFailed) && task.Status != string(models.ModelArtsTrainJobSubmitFailed) && task.Status != string(models.ModelArtsTrainJobDeleteFailed) && | |||
task.Status != string(models.ModelArtsTrainJobCompleted) && task.Status != string(models.ModelArtsTrainJobFailed) && | |||
task.Status != string(models.ModelArtsTrainJobKilled) && task.Status != string(models.ModelArtsTrainJobCanceled) && task.Status != string(models.ModelArtsTrainJobLost) { | |||
log.Error("the job(%s) version has not been stopped", task.JobName) | |||
ctx.NotFound(err) | |||
return | |||
} | |||
//删除modelarts上的记录 | |||
_, err = modelarts.DelTrainJobVersion(jobID, strconv.FormatInt(task.VersionID, 10)) | |||
if err != nil { | |||
@@ -767,10 +767,6 @@ func generateCommand(repoName, processorType, codeRemotePath, dataRemotePath, bo | |||
command += commandDownload | |||
} | |||
//check download result | |||
commandCheckRes := "bash -c \"[[ $? -eq 0 ]] && exit 0 || exit -1;\";" | |||
command += commandCheckRes | |||
//unzip code & dataset | |||
toolUnzip := "unzip -q '" | |||
if strings.HasSuffix(datasetName, ".tar.gz") { | |||
@@ -779,16 +775,22 @@ func generateCommand(repoName, processorType, codeRemotePath, dataRemotePath, bo | |||
commandUnzip := "cd " + workDir + "code;unzip -q master.zip;echo \"start to unzip dataset\";cd " + workDir + "dataset;" + toolUnzip + datasetName + "';" | |||
command += commandUnzip | |||
//check unzip result | |||
commandCheckRes = "bash -c \"[[ $? -eq 0 ]] && exit 0 || exit -1;\";" | |||
command += commandCheckRes | |||
command += "echo \"unzip finished;start to exec code;\";" | |||
// set export | |||
var commandExport string | |||
if processorType == grampus.ProcessorTypeNPU { | |||
commandExport = "export bucket=" + setting.Bucket + " && export remote_path=" + outputRemotePath + ";" | |||
} else if processorType == grampus.ProcessorTypeGPU { | |||
commandExport = "export env=" + setting.Grampus.Env + " && export remote_path=" + outputRemotePath + ";" | |||
} | |||
command += commandExport | |||
//exec code | |||
var parameters models.Parameters | |||
var paramCode string | |||
param := make([]models.Parameter, 0) | |||
if len(paramSrc) != 0 { | |||
err := json.Unmarshal([]byte(paramSrc), ¶meters) | |||
if err != nil { | |||
@@ -797,10 +799,6 @@ func generateCommand(repoName, processorType, codeRemotePath, dataRemotePath, bo | |||
} | |||
for _, parameter := range parameters.Parameter { | |||
param = append(param, models.Parameter{ | |||
Label: parameter.Label, | |||
Value: parameter.Value, | |||
}) | |||
paramCode += " --" + parameter.Label + "=" + parameter.Value | |||
} | |||
} | |||
@@ -820,15 +818,15 @@ func generateCommand(repoName, processorType, codeRemotePath, dataRemotePath, bo | |||
//upload models | |||
if processorType == grampus.ProcessorTypeNPU { | |||
commandUpload := "cd " + workDir + "script_for_grampus/;./uploader_for_obs " + setting.Bucket + " " + outputRemotePath + " " + workDir + "output/;" | |||
commandUpload := "cd " + workDir + "script_for_grampus/;./uploader_for_npu " + setting.Bucket + " " + outputRemotePath + " " + workDir + "output/;" | |||
command += commandUpload | |||
} else if processorType == grampus.ProcessorTypeGPU { | |||
commandUpload := "cd " + workDir + "script_for_grampus/;./uploader_for_minio " + setting.Grampus.Env + " " + outputRemotePath + " " + workDir + "output/;" | |||
commandUpload := "cd " + workDir + "script_for_grampus/;./uploader_for_gpu " + setting.Grampus.Env + " " + outputRemotePath + " " + workDir + "output/;" | |||
command += commandUpload | |||
} | |||
//check exec result | |||
commandCheckRes = "bash -c \"[[ $result -eq 0 ]] && exit 0 || exit -1\"" | |||
commandCheckRes := "bash -c \"[[ $result -eq 0 ]] && exit 0 || exit -1\"" | |||
command += commandCheckRes | |||
return command, nil | |||
@@ -502,9 +502,11 @@ func NotebookRestart(ctx *context.Context) { | |||
break | |||
} | |||
id = strconv.FormatInt(newTask.ID, 10) | |||
status = res.Status | |||
resultCode = "0" | |||
notification.NotifyOtherTask(ctx.User, ctx.Repo.Repository, strconv.FormatInt(newTask.ID, 10), newTask.DisplayJobName, models.ActionCreateDebugNPUTask) | |||
notification.NotifyOtherTask(ctx.User, ctx.Repo.Repository, id, newTask.DisplayJobName, models.ActionCreateDebugNPUTask) | |||
break | |||
} | |||
@@ -896,12 +898,12 @@ func trainJobNewVersionDataPrepare(ctx *context.Context) error { | |||
ctx.Data["display_job_name"] = task.DisplayJobName | |||
ctx.Data["job_name"] = task.JobName | |||
attachs, err := models.GetModelArtsTrainAttachments(ctx.User.ID) | |||
if err != nil { | |||
ctx.ServerError("GetAllUserAttachments failed:", err) | |||
return err | |||
} | |||
ctx.Data["attachments"] = attachs | |||
// attachs, err := models.GetModelArtsTrainAttachments(ctx.User.ID) | |||
// if err != nil { | |||
// ctx.ServerError("GetAllUserAttachments failed:", err) | |||
// return err | |||
// } | |||
// ctx.Data["attachments"] = attachs | |||
var resourcePools modelarts.ResourcePool | |||
if err = json.Unmarshal([]byte(setting.ResourcePools), &resourcePools); err != nil { | |||
@@ -945,12 +947,16 @@ func trainJobNewVersionDataPrepare(ctx *context.Context) error { | |||
ctx.ServerError("GetBranches error:", err) | |||
return err | |||
} | |||
_, _, datasetNames, _, err := getDatasUrlListByUUIDS(task.Uuid) | |||
if err != nil { | |||
ctx.ServerError("GetAllUserAttachments failed:", err) | |||
return err | |||
} | |||
ctx.Data["branches"] = branches | |||
ctx.Data["branch_name"] = task.BranchName | |||
ctx.Data["description"] = task.Description | |||
ctx.Data["boot_file"] = task.BootFile | |||
ctx.Data["dataset_name"] = task.DatasetName | |||
ctx.Data["dataset_name"] = datasetNames | |||
ctx.Data["work_server_number"] = task.WorkServerNumber | |||
ctx.Data["flavor_name"] = task.FlavorName | |||
ctx.Data["engine_name"] = task.EngineName | |||
@@ -1839,6 +1845,16 @@ func TrainJobDel(ctx *context.Context) { | |||
return | |||
} | |||
for _, task := range VersionListTasks { | |||
if task.Status != string(models.ModelArtsTrainJobImageFailed) && task.Status != string(models.ModelArtsTrainJobSubmitFailed) && task.Status != string(models.ModelArtsTrainJobDeleteFailed) && | |||
task.Status != string(models.ModelArtsTrainJobCompleted) && task.Status != string(models.ModelArtsTrainJobFailed) && | |||
task.Status != string(models.ModelArtsTrainJobKilled) && task.Status != string(models.ModelArtsTrainJobCanceled) && task.Status != string(models.ModelArtsTrainJobLost) { | |||
log.Error("the job(%s) version has not been stopped", task.JobName) | |||
ctx.RenderWithErr("the job version has not been stopped", tplModelArtsTrainJobIndex, nil) | |||
return | |||
} | |||
} | |||
//删除modelarts上的任务记录 | |||
_, err = modelarts.DelTrainJob(jobID) | |||
if err != nil { | |||
@@ -1972,7 +1988,7 @@ func InferenceJobCreate(ctx *context.Context, form auth.CreateModelArtsInference | |||
codeObsPath := "/" + setting.Bucket + modelarts.JobPath + jobName + modelarts.CodePath | |||
resultObsPath := "/" + setting.Bucket + modelarts.JobPath + jobName + modelarts.ResultPath + VersionOutputPath + "/" | |||
logObsPath := "/" + setting.Bucket + modelarts.JobPath + jobName + modelarts.LogPath + VersionOutputPath + "/" | |||
dataPath := "/" + setting.Bucket + "/" + setting.BasePath + path.Join(uuid[0:1], uuid[1:2]) + "/" + uuid + uuid + "/" | |||
//dataPath := "/" + setting.Bucket + "/" + setting.BasePath + path.Join(uuid[0:1], uuid[1:2]) + "/" + uuid + uuid + "/" | |||
branchName := form.BranchName | |||
FlavorName := form.FlavorName | |||
EngineName := form.EngineName | |||
@@ -2050,6 +2066,13 @@ func InferenceJobCreate(ctx *context.Context, form auth.CreateModelArtsInference | |||
gitRepo, _ := git.OpenRepository(repo.RepoPath()) | |||
commitID, _ := gitRepo.GetBranchCommitID(branchName) | |||
_, dataUrl, datasetNames, _, err := getDatasUrlListByUUIDS(uuid) | |||
if err != nil { | |||
inferenceJobErrorNewDataPrepare(ctx, form) | |||
ctx.RenderWithErr(ctx.Tr(errStr), tplModelArtsInferenceJobNew, &form) | |||
return | |||
} | |||
if err := downloadCode(repo, codeLocalPath, branchName); err != nil { | |||
log.Error("Create task failed, server timed out: %s (%v)", repo.FullName(), err) | |||
inferenceJobErrorNewDataPrepare(ctx, form) | |||
@@ -2120,7 +2143,7 @@ func InferenceJobCreate(ctx *context.Context, form auth.CreateModelArtsInference | |||
req := &modelarts.GenerateInferenceJobReq{ | |||
JobName: jobName, | |||
DisplayJobName: displayJobName, | |||
DataUrl: dataPath, | |||
DataUrl: dataUrl, | |||
Description: description, | |||
CodeObsPath: codeObsPath, | |||
BootFileUrl: codeObsPath + bootFile, | |||
@@ -2146,6 +2169,7 @@ func InferenceJobCreate(ctx *context.Context, form auth.CreateModelArtsInference | |||
ModelVersion: modelVersion, | |||
CkptName: ckptName, | |||
ResultUrl: resultObsPath, | |||
DatasetName: datasetNames, | |||
} | |||
err = modelarts.GenerateInferenceJob(ctx, req) | |||
@@ -2700,11 +2724,23 @@ func getDatasUrlListByUUIDS(uuidStr string) ([]models.Datasurl, string, string, | |||
datasetInfos := make(map[string]models.DatasetInfo) | |||
attachs, err := models.GetAttachmentsByUUIDs(uuids) | |||
if err != nil { | |||
if err != nil || len(attachs) != len(uuids) { | |||
log.Error("GetAttachmentsByUUIDs failed: %v", err) | |||
return datasUrlList, dataUrl, datasetNames, isMultiDataset, errors.New("GetAttachmentsByUUIDs failed") | |||
} | |||
for i, attach := range attachs { | |||
for i, tmpUuid := range uuids { | |||
var attach *models.Attachment | |||
for _, tmpAttach := range attachs { | |||
if tmpAttach.UUID == tmpUuid { | |||
attach = tmpAttach | |||
break | |||
} | |||
} | |||
if attach == nil { | |||
log.Error("GetAttachmentsByUUIDs failed: %v", err) | |||
return datasUrlList, dataUrl, datasetNames, isMultiDataset, errors.New("GetAttachmentsByUUIDs failed") | |||
} | |||
fileName := strings.TrimSuffix(strings.TrimSuffix(strings.TrimSuffix(attach.Name, ".zip"), ".tar.gz"), ".tgz") | |||
for _, datasetInfo := range datasetInfos { | |||
if fileName == datasetInfo.Name { | |||
@@ -464,6 +464,16 @@ func SettingsPost(ctx *context.Context, form auth.RepoSettingForm) { | |||
} | |||
return | |||
} | |||
dataset, err := models.GetDatasetByRepo(repo) | |||
if err == nil { | |||
if dataset != nil { | |||
models.UpdateDatasetCreateUser(dataset.ID, newOwner) | |||
} else { | |||
log.Info("not found the dataset") | |||
} | |||
} else { | |||
log.Info("error=" + err.Error()) | |||
} | |||
log.Trace("Repository transferred: %s/%s -> %s", ctx.Repo.Owner.Name, repo.Name, newOwner) | |||
ctx.Flash.Success(ctx.Tr("repo.settings.transfer_succeed")) | |||
@@ -1109,7 +1109,7 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
m.Post("/del", cloudbrain.AdminOrOwnerOrJobCreaterRightForTrain, repo.CloudBrainTrainJobDel) | |||
//m.Get("/models", reqRepoCloudBrainReader, repo.CloudBrainShowModels) | |||
m.Get("/download_model", cloudbrain.AdminOrOwnerOrJobCreaterRightForTrain, repo.CloudBrainDownloadModel) | |||
//m.Get("/create_version", reqWechatBind, cloudbrain.AdminOrJobCreaterRightForTrain, repo.TrainJobNewVersion) | |||
//m.Get("/get_log", cloudbrain.AdminOrJobCreaterRightForTrain, repo.GetLogFromModelDir) | |||
//m.Post("/create_version", reqWechatBind, cloudbrain.AdminOrJobCreaterRightForTrain, bindIgnErr(auth.CreateModelArtsTrainJobForm{}), repo.TrainJobCreateVersion) | |||
}) | |||
m.Get("/create", reqWechatBind, reqRepoCloudBrainWriter, repo.CloudBrainTrainJobNew) | |||
@@ -13,9 +13,9 @@ | |||
{{ end }} | |||
<i | |||
class="ri-error-warning-line" | |||
style="margin-right: 0.5rem; font-size: 16px" | |||
style="margin-right: 0.5rem; font-size: 14px" | |||
></i> | |||
<span id="gpu-nums" | |||
<span id="gpu-nums" style="font-size: 12px" | |||
>{{.i18n.Tr "repo.wait_count_start"}} | |||
{{if .QueuesDetail}} | |||
{{ $gpuQueue }} | |||
@@ -14,9 +14,9 @@ | |||
{{ end }} | |||
<i | |||
class="ri-error-warning-line" | |||
style="margin-right: 0.5rem; font-size: 16px" | |||
style="margin-right: 0.5rem; font-size: 14px" | |||
></i> | |||
<span id="gpu-nums" | |||
<span id="gpu-nums" style="font-size: 12px" | |||
>{{.ctx.i18n.Tr "repo.wait_count_start"}} | |||
{{if .type}} | |||
{{ $gpuQueue }} | |||
@@ -89,8 +89,8 @@ | |||
<div class="ui vertical masthead secondary c2net segment"> | |||
<div class="ui container"> | |||
<div class="ui center am-pt-30 am-pb-30"> | |||
<h2>智算网络</h2> | |||
<p><span class="ui text grey">人工智能算力网络推进联盟已接入11家智算中心,算力总规模1924P</p> | |||
<h2>{{.i18n.Tr "home.c2net_title"}}</h2> | |||
<p><span class="ui text grey">{{.i18n.Tr "home.c2net_desc"}}</p> | |||
</div> | |||
<div id="app" v-cloak> | |||
@@ -98,7 +98,7 @@ | |||
<div class="rotation3D-baseMap"></div> | |||
<!--旋转3D--> | |||
<div id="rotation3D" class="rotation3D"> | |||
<button class="center">中心</button> | |||
<button class="center">{{.i18n.Tr "home.c2net_center"}}</button> | |||
<div class="itemList"> | |||
<div class="rotation3D__item" :class="item.type" v-for="item in itemList"> | |||
@@ -40,7 +40,7 @@ | |||
<input type="hidden" name="benchmarkMode" value="{{.benchmarkMode}}"> | |||
{{if eq .benchmarkMode "model"}} | |||
<form class="ui form model_form" action="{{.Link}}?benchmarkMode=model" method="post"> | |||
<form id="form_id" class="ui form model_form" action="{{.Link}}?benchmarkMode=model" method="post"> | |||
{{.CsrfTokenHtml}} | |||
<input type="hidden" name="action" value="update"> | |||
<div class="required min_title inline field"> | |||
@@ -251,6 +251,12 @@ | |||
{{template "base/footer" .}} | |||
<script> | |||
let form = document.getElementById('form_id'); | |||
let createFlag = false | |||
form.onsubmit = function (e) { | |||
if(createFlag) return false | |||
createFlag = true | |||
} | |||
let repolink = {{.RepoLink }} | |||
let url_href = window.location.pathname.split('create')[0] | |||
$(".ui.button").attr('href', url_href) | |||
@@ -47,7 +47,7 @@ | |||
</h4> | |||
<div class="ui attached segment"> | |||
<!-- equal width --> | |||
<form class="ui form" action="{{.Link}}" method="post"> | |||
<form id="form_id" class="ui form" action="{{.Link}}" method="post"> | |||
{{.CsrfTokenHtml}} | |||
<input type="hidden" name="action" value="update"> | |||
<input type="hidden" id="ai_image_name" value="{{.image}}"> | |||
@@ -186,8 +186,10 @@ | |||
{{end}} | |||
</select> | |||
</div> | |||
<!-- 数据集 --> | |||
{{template "custom/select_dataset_train" .}} | |||
<!-- 数据集--> | |||
<div id="select-multi-dataset"> | |||
</div> | |||
<span class="tooltips" style="margin-left: 11.5rem;margin-bottom: 1rem;"></span> | |||
<div class="inline min_title field required"> | |||
<label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.start_file"}}</label> | |||
@@ -260,6 +262,12 @@ | |||
{{template "base/footer" .}} | |||
<script> | |||
let form = document.getElementById('form_id'); | |||
let createFlag = false | |||
form.onsubmit = function (e) { | |||
if(createFlag) return false | |||
createFlag = true | |||
} | |||
const RepoLink = {{.RepoLink}} | |||
let nameMap,nameList | |||
// 获取模型列表和模型名称对应的模型版本 | |||
@@ -268,7 +268,7 @@ | |||
<a class="item load-model-file" data-tab="four" | |||
data-gpu-flag="true" data-download-flag="{{$.canDownload}}" data-path="{{$.RepoLink}}/cloudbrain/inference-job/{{.JobID}}/result_list" data-version="{{.VersionName}}" data-parents="" data-filename="" data-init="init" >{{$.i18n.Tr "repo.model_download"}}</a> | |||
</div> | |||
<div class="ui tab active" data-tab="first" style="height:400px"> | |||
<div class="ui tab active" data-tab="first"> | |||
<div style="padding-top: 10px;"> | |||
<div class="tab_2_content"> | |||
<div class="ac-grid ac-grid-col2"> | |||
@@ -461,19 +461,7 @@ | |||
</div> | |||
</td> | |||
</tr> | |||
<tr class="ti-no-ng-animate"> | |||
<td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||
{{$.i18n.Tr "repo.modelarts.infer_dataset"}} | |||
</td> | |||
<td class="ti-text-form-content"> | |||
<div class="text-span text-span-w"> | |||
{{range $m ,$n := $.datasetDownload}} | |||
<a href="{{.RepositoryLink}}" target="_blank">{{.DatasetName}}</a> | |||
{{end}} | |||
</div> | |||
</td> | |||
</tr> | |||
<tr class="ti-no-ng-animate"> | |||
<td class="ti-no-ng-animate ti-text-form-label text-width80" > | |||
{{$.i18n.Tr "repo.modelarts.train_job.run_parameter"}} | |||
@@ -504,6 +492,22 @@ | |||
</table> | |||
</div> | |||
</div> | |||
<div style="clear:both"> | |||
<table style="border:none" class="ui fixed small stackable table"> | |||
<thead> | |||
<tr><th style="color: #8a8e99;font-size:12px" class="three wide left aligned">{{$.i18n.Tr "dataset.file"}}</th> | |||
</tr></thead> | |||
<tbody> | |||
{{range $m ,$n := $.datasetDownload}} | |||
<tr> | |||
<td style="word-wrap: break-word;word-break: break-all;"><a href="{{.RepositoryLink}}" target="_blank">{{.DatasetName}}</a></td> | |||
</tr> | |||
{{end}} | |||
</tbody> | |||
</table> | |||
</div> | |||
</div> | |||
</div> | |||
@@ -217,7 +217,9 @@ | |||
}) | |||
} | |||
validate(); | |||
let createFlag = false | |||
form.onsubmit = function (e) { | |||
if(createFlag) return false | |||
let value_task = $("input[name='display_job_name']").val() | |||
let value_image = $("input[name='image']").val() | |||
let value_data = $("input[name='attachment']").val() | |||
@@ -231,6 +233,7 @@ | |||
} | |||
let min_value_task = value_task.toLowerCase() | |||
$("input[name='display_job_name']").attr("value", min_value_task) | |||
createFlag = true | |||
document.getElementById("mask").style.display = "block" | |||
} | |||
@@ -276,13 +279,14 @@ | |||
} | |||
}) | |||
}) | |||
$('.ui.green.button').click(function () { | |||
if (!$('input[name="isBranches"]').val()) { | |||
return false | |||
} | |||
selected_value = $("#cloudbrain_benchmark_category").val() | |||
$('#store_category').attr("value", selected_value) | |||
}) | |||
</script> |
@@ -364,18 +364,7 @@ | |||
</td> | |||
</tr> | |||
<tr class="ti-no-ng-animate"> | |||
<td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||
{{$.i18n.Tr "repo.modelarts.train_job.dura_time"}} | |||
</td> | |||
<td class="ti-text-form-content"> | |||
<div class="text-span text-span-w" | |||
id="{{.VersionName}}-duration"> | |||
{{$.duration}} | |||
</div> | |||
</td> | |||
</tr> | |||
@@ -404,20 +393,7 @@ | |||
</div> | |||
</td> | |||
</tr> | |||
<tr class="ti-no-ng-animate"> | |||
<td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||
{{$.i18n.Tr "repo.modelarts.train_job.dataset"}} | |||
</td> | |||
<td class="ti-text-form-content"> | |||
<div class="text-span text-span-w" | |||
id="{{.VersionName}}-BenchmarkTypeName"> | |||
{{range $m ,$n := $.datasetDownload}} | |||
<a href="{{.RepositoryLink}}" target="_blank">{{.DatasetName}}</a> | |||
{{end}} | |||
</div> | |||
</td> | |||
</tr> | |||
<tr class="ti-no-ng-animate"> | |||
<td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||
@@ -496,14 +472,40 @@ | |||
</div> | |||
</td> | |||
</tr> | |||
<tr class="ti-no-ng-animate"> | |||
<td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||
{{$.i18n.Tr "repo.modelarts.train_job.dura_time"}} | |||
</td> | |||
<td class="ti-text-form-content"> | |||
<div class="text-span text-span-w" | |||
id="{{.VersionName}}-duration"> | |||
{{$.duration}} | |||
</div> | |||
</td> | |||
</tr> | |||
</tbody> | |||
</table> | |||
</div> | |||
</div> | |||
</div> | |||
<div style="clear:both"> | |||
<table style="border:none" class="ui fixed small stackable table"> | |||
<thead> | |||
<tr><th style="color: #8a8e99;font-size:12px" class="three wide left aligned">{{$.i18n.Tr "dataset.file"}}</th> | |||
</tr></thead> | |||
<tbody> | |||
{{range $m ,$n := $.datasetDownload}} | |||
<tr> | |||
<td style="word-wrap: break-word;word-break: break-all;"><a href="{{.RepositoryLink}}" target="_blank">{{.DatasetName}}</a></td> | |||
</tr> | |||
{{end}} | |||
</tbody> | |||
</table> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="ui tab" data-tab="second{{$k}}"> | |||
@@ -75,7 +75,7 @@ | |||
</h4> | |||
<div class="ui attached segment"> | |||
<!-- equal width --> | |||
<form class="ui form" action="{{.Link}}" method="post"> | |||
<form id="form_id" class="ui form" action="{{.Link}}" method="post"> | |||
{{.CsrfTokenHtml}} | |||
<input type="hidden" name="action" value="update"> | |||
<input type="hidden" id="ai_image_name" value="{{.image}}"> | |||
@@ -115,6 +115,10 @@ | |||
Ascend NPU</a> | |||
</div> | |||
{{template "custom/wait_count_train" Dict "ctx" $ "type" .train_gpu_types}} | |||
<div style="display: flex;align-items: center;margin-left: 155px;margin-top: 0.5rem;"> | |||
<i class="ri-error-warning-line" style="color: #f2711c;margin-right: 0.5rem;"></i> | |||
<span style="color: #888;font-size: 12px;">{{.i18n.Tr "cloudbrain.new_train_gpu_tooltips" "/code" "/dataset" "/model" | Safe}}</span> | |||
</div> | |||
</div> | |||
<div class="required min_title inline field"> | |||
<label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.job_name"}}</label> | |||
@@ -212,8 +216,7 @@ | |||
<div id="select-multi-dataset"> | |||
</div> | |||
<span class="tooltips" | |||
style="margin-left: 11.5rem;margin-bottom: 1rem;">训练脚本存储在/code中,数据集存储在/dataset中,训练输出请存储在/model中以供后续下载。</span> | |||
<span class="tooltips" style="margin-left: 11.5rem;margin-bottom: 1rem;"></span> | |||
<div class="inline min_title field"> | |||
<label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.run_parameter"}}</label> | |||
<span id="add_run_para" | |||
@@ -266,6 +269,12 @@ | |||
{{template "base/footer" .}} | |||
<script> | |||
let form = document.getElementById('form_id'); | |||
let createFlag = false | |||
form.onsubmit = function (e) { | |||
if(createFlag) return false | |||
createFlag = true | |||
} | |||
$('select.dropdown') | |||
.dropdown(); | |||
@@ -286,10 +286,14 @@ | |||
<div class="ui pointing secondary menu" style="border-bottom: 1px solid rgba(34,36,38,.15);"> | |||
<a class="active item" | |||
data-tab="first{{$k}}">{{$.i18n.Tr "repo.modelarts.train_job.config"}}</a> | |||
<a class="item" data-tab="second{{$k}}" | |||
onclick="javascript:parseInfo()">{{$.i18n.Tr "repo.cloudbrain.runinfo"}}</a> | |||
<a class="item" data-tab="third{{$k}}" | |||
onclick="loadLog({{.VersionName}})">{{$.i18n.Tr "repo.modelarts.log"}}</a> | |||
<a class="item log_bottom" data-tab="third{{$k}}" | |||
data-version="{{.VersionName}}">{{$.i18n.Tr "repo.modelarts.log"}}</a> | |||
<a class="item load-model-file" data-tab="four{{$k}}" data-gpu-flag="true" data-download-flag="{{$.canDownload}}" data-path="{{$.RepoLink}}/cloudbrain/train-job/{{.JobID}}/model_list" data-version="{{.VersionName}}" data-parents="" data-filename="" data-init="init" >{{$.i18n.Tr "repo.model_download"}}</a> | |||
</div> | |||
<div class="ui tab active" data-tab="first{{$k}}"> | |||
@@ -423,19 +427,7 @@ | |||
</td> | |||
</tr> | |||
<tr class="ti-no-ng-animate"> | |||
<td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||
{{$.i18n.Tr "repo.modelarts.train_job.train_dataset"}} | |||
</td> | |||
<td class="ti-text-form-content"> | |||
<div class="text-span text-span-w"> | |||
{{range $m ,$n := $.datasetDownload}} | |||
<a href="{{.RepositoryLink}}" target="_blank">{{.DatasetName}}</a> | |||
{{end}} | |||
</div> | |||
</td> | |||
</tr> | |||
<tr class="ti-no-ng-animate"> | |||
<td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||
@@ -464,6 +456,22 @@ | |||
</table> | |||
</div> | |||
</div> | |||
<div style="clear:both"> | |||
<table style="border:none" class="ui fixed small stackable table"> | |||
<thead> | |||
<tr><th style="color: #8a8e99;font-size:12px" class="three wide left aligned">{{$.i18n.Tr "dataset.file"}}</th> | |||
</tr></thead> | |||
<tbody> | |||
{{range $m ,$n := $.datasetDownload}} | |||
<tr> | |||
<td style="word-wrap: break-word;word-break: break-all;"><a href="{{.RepositoryLink}}" target="_blank">{{.DatasetName}}</a></td> | |||
</tr> | |||
{{end}} | |||
</tbody> | |||
</table> | |||
</div> | |||
</div> | |||
</div> | |||
@@ -474,7 +482,7 @@ | |||
<div class="ui message message{{.VersionName}}" style="display: none;"> | |||
<div id="header"></div> | |||
</div> | |||
<div class="ui attached log" id="log{{.VersionName}}" | |||
<div class="ui attached log" id="log_state{{.VersionName}}" | |||
style="height: 390px !important; overflow: auto;"> | |||
<input type="hidden" id="json_value" value="{{$.result.JobStatus.AppExitDiagnostics}}"> | |||
<input type="hidden" id="ExitDiagnostics" value="{{$.ExitDiagnostics}}"> | |||
@@ -488,18 +496,41 @@ | |||
</div> | |||
<div class="ui tab" data-tab="third{{$k}}"> | |||
<div> | |||
<div> | |||
<a id="{{.VersionName}}-log-down" | |||
class='{{if $.canDownload}}ti-download-file{{else}}disabled{{end}}' | |||
href="/api/v1/repos/{{$.RepoRelPath}}/cloudbrain/train-job/{{.JobID}}/download_log_file"> | |||
<i class="ri-download-cloud-2-line"></i> | |||
<span style="margin-left: 0.3rem;">{{$.i18n.Tr "repo.modelarts.download_log"}}</span> | |||
</a> | |||
</div> | |||
<div | |||
style="position: relative;border: 1px solid rgba(0,0,0,.2);padding: 0 10px;margin-top: 10px;"> | |||
<span> | |||
<a title="滚动到顶部" style="position: absolute; right: -32px;cursor: pointer;" | |||
class="log_top" data-version="{{.VersionName}}"><i class="icon-to-top"></i></a> | |||
</span> | |||
<span class="log-info-{{.VersionName}}"> | |||
<a title="滚动到底部" style="position: absolute; bottom: 10px;right: -32px;cursor: pointer;" | |||
class="log_bottom" data-version="{{.VersionName}}"><i | |||
class="icon-to-bottom"></i></a> | |||
</span> | |||
<div class="ui message message{{.VersionName}}" style="display: none;"> | |||
<div id="header"></div> | |||
</div> | |||
<div class="ui attached log" id="log{{.VersionName}}" | |||
<div class="ui attached log log-scroll" id="log{{.VersionName}}" data-version="{{.VersionName}}" | |||
style="height: 300px !important; overflow: auto;"> | |||
<div class="ui inverted active dimmer"> | |||
<div class="ui loader"></div> | |||
</div> | |||
<input type="hidden" name="end_line" value> | |||
<input type="hidden" name="start_line" value> | |||
<pre id="log_file{{.VersionName}}"></pre> | |||
</div> | |||
</div> | |||
</div> | |||
@@ -870,7 +901,15 @@ | |||
function loadLog(version_name) { | |||
document.getElementById("mask").style.display = "block" | |||
$.get(`/api/v1/repos/${userName}/${repoPath}/cloudbrain/${taskID}/log?version_name=${version_name}&lines=50&order=asc`, (data) => { | |||
let startLine = $('input[name=end_line]').val(); | |||
if(startLine==""){ | |||
startLine=0; | |||
} | |||
let endLine = $('input[name=end_line]').val(); | |||
if(endLine==""){ | |||
endLine = 50; | |||
} | |||
$.get(`/${userName}/${repoPath}/cloudbrain/train-job/${jobID}/get_log?endLine=${endLine}&startLine=${startLine}`, (data) => { | |||
$('input[name=end_line]').val(data.EndLine) | |||
$('input[name=start_line]').val(data.StartLine) | |||
$(`#log_file${version_name}`).text(data.Content) | |||
@@ -235,7 +235,8 @@ | |||
<div class="two wide column text center"> | |||
<!-- 任务计算资源 --> | |||
<span style="font-size: 12px;margin-left: 0.4rem;" | |||
class="">{{.ComputeResource}}</span> | |||
class=""> | |||
{{.ComputeResource}}</span> | |||
</div> | |||
<div class="one wide column text center"> | |||
{{if .User.Name}} | |||
@@ -66,7 +66,7 @@ | |||
</h4> | |||
<div class="ui attached segment"> | |||
<!-- equal width --> | |||
<form class="ui form" action="{{.Link}}" method="post"> | |||
<form id="form_id" class="ui form" action="{{.Link}}" method="post"> | |||
{{.CsrfTokenHtml}} | |||
<input type="hidden" name="action" value="update"> | |||
<input type="hidden" id="ai_engine_name" name="engine_name" value=""> | |||
@@ -106,6 +106,10 @@ | |||
Ascend NPU</a> | |||
</div> | |||
{{template "custom/wait_count_train" Dict "ctx" $}} | |||
<div style="display: flex;align-items: center;margin-left: 155px;margin-top: 0.5rem;"> | |||
<i class="ri-error-warning-line" style="color: #f2711c;margin-right: 0.5rem;"></i> | |||
<span style="color: #888;font-size: 12px;">{{.i18n.Tr "cloudbrain.new_train_gpu_tooltips" "/tmp/code" "/tmp/dataset" "/tmp/output" | Safe}}</span> | |||
</div> | |||
</div> | |||
<div class="required min_title inline field"> | |||
<label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.job_name"}}</label> | |||
@@ -165,7 +169,7 @@ | |||
{{template "custom/select_dataset_train" .}} | |||
<span class="tooltips" style="margin-left: 11.5rem;margin-bottom: 2rem;">{{.i18n.Tr "repo.grampus.gpu_dataset_path_rule"}}</span> | |||
<span class="tooltips" style="margin-left: 11.5rem;margin-bottom: 1rem;"></span> | |||
<div class="inline min_title field"> | |||
<label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.run_parameter"}}</label> | |||
<span id="add_run_para" style="margin-left: 0.5rem;cursor:pointer;color: rgba(3, 102, 214, 100);font-size: 14px;line-height: 26px;font-family: SourceHanSansSC-medium;"><i class="plus square outline icon"></i>{{.i18n.Tr "repo.modelarts.train_job.add_run_parameter"}}</span> | |||
@@ -214,8 +218,12 @@ | |||
{{template "base/footer" .}} | |||
<script> | |||
//let url_href = window.location.pathname.split('create')[0] | |||
//$(".ui.button").attr('href',url_href) | |||
let form = document.getElementById('form_id'); | |||
let createFlag = false | |||
form.onsubmit = function (e) { | |||
if(createFlag) return false | |||
createFlag = true | |||
} | |||
$('select.dropdown') | |||
.dropdown(); | |||
@@ -61,7 +61,7 @@ | |||
</h4> | |||
<div class="ui attached segment"> | |||
<!-- equal width --> | |||
<form class="ui form" action="{{.Link}}" method="post"> | |||
<form id="form_id" class="ui form" action="{{.Link}}" method="post"> | |||
{{.CsrfTokenHtml}} | |||
<input type="hidden" name="action" value="update"> | |||
<input type="hidden" id="ai_engine_name" name="engine_name" value=""> | |||
@@ -100,6 +100,10 @@ | |||
Ascend NPU</a> | |||
</div> | |||
{{template "custom/wait_count_train" Dict "ctx" $}} | |||
<div style="display: flex;align-items: center;margin-left: 155px;margin-top: 0.5rem;"> | |||
<i class="ri-error-warning-line" style="color: #f2711c;margin-right: 0.5rem;"></i> | |||
<span style="color: #888;font-size: 12px;">{{.i18n.Tr "cloudbrain.new_train_gpu_tooltips" "/cache/code" "/cache/dataset" "/cache/output" | Safe}}</span> | |||
</div> | |||
</div> | |||
<div class="required min_title inline field"> | |||
@@ -177,7 +181,7 @@ | |||
</div> | |||
{{template "custom/select_dataset_train" .}} | |||
<span class="tooltips" style="margin-left: 11.5rem;margin-bottom: 2rem;">{{.i18n.Tr "repo.grampus.dataset_path_rule"}}</span> | |||
<span class="tooltips" style="margin-left: 11.5rem;margin-bottom: 1rem;"></span> | |||
<div class="inline min_title field"> | |||
<label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.run_parameter"}}</label> | |||
<span id="add_run_para" style="margin-left: 0.5rem;cursor:pointer;color: rgba(3, 102, 214, 100);font-size: 14px;line-height: 26px;font-family: SourceHanSansSC-medium;"><i class="plus square outline icon"></i>{{.i18n.Tr "repo.modelarts.train_job.add_run_parameter"}}</span> | |||
@@ -240,7 +244,12 @@ | |||
{{template "base/footer" .}} | |||
<script> | |||
let form = document.getElementById('form_id'); | |||
let createFlag = false | |||
form.onsubmit = function (e) { | |||
if(createFlag) return false | |||
createFlag = true | |||
} | |||
$('select.dropdown') | |||
.dropdown(); | |||
@@ -40,12 +40,13 @@ | |||
{{template "repo/header" .}} | |||
<div class="ui container"> | |||
{{template "base/alert" .}} | |||
<div class="cloudbrain-type" style="display: none;" data-cloudbrain-type="1" data-repo-link="{{.RepoLink}}"></div> | |||
<h4 class="ui top attached header"> | |||
{{.i18n.Tr "repo.modelarts.train_job.new_infer"}} | |||
</h4> | |||
<div class="ui attached segment"> | |||
<!-- equal width --> | |||
<form class="ui form" action="{{.Link}}" method="post"> | |||
<form id="form_id" class="ui form" action="{{.Link}}" method="post"> | |||
{{.CsrfTokenHtml}} | |||
<input type="hidden" name="action" value="update"> | |||
<input type="hidden" id="ai_engine_name" name="engine_names" value=""> | |||
@@ -83,6 +84,10 @@ | |||
Ascend NPU</a> | |||
</div> | |||
{{template "custom/wait_count_train" Dict "ctx" $}} | |||
<div style="display: flex;align-items: center;margin-left: 155px;margin-top: 0.5rem;"> | |||
<i class="ri-error-warning-line" style="color: #f2711c;margin-right: 0.5rem;"></i> | |||
<span style="color: #888;font-size: 12px;">{{.i18n.Tr "cloudbrain.infer_dataset_path_rule" | Safe}}</span> | |||
</div> | |||
</div> | |||
<div class="required min_title inline field"> | |||
<label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.job_name"}}</label> | |||
@@ -191,9 +196,12 @@ | |||
{{end}} | |||
</select> | |||
</div> | |||
<!-- 数据集 --> | |||
{{template "custom/select_dataset_train" .}} | |||
<span class="tooltips" style="margin-left: 11.5rem;margin-bottom: 2rem;">{{.i18n.Tr "cloudbrain.dataset_path_rule"}}</span> | |||
<span class="tooltips" style="margin-left: 11.5rem;margin-bottom: 1rem;"></span> | |||
<!-- 数据集 --> | |||
<div id="select-multi-dataset"> | |||
</div> | |||
<span class="tooltips" style="margin-left: 11.5rem;margin-bottom: 1rem;"></span> | |||
<div class="inline min_title field required"> | |||
<label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.start_file"}}</label> | |||
{{if .bootFile}} | |||
@@ -287,6 +295,12 @@ | |||
{{template "base/footer" .}} | |||
<script> | |||
let form = document.getElementById('form_id'); | |||
let createFlag = false | |||
form.onsubmit = function (e) { | |||
if(createFlag) return false | |||
createFlag = true | |||
} | |||
const RepoLink = {{.RepoLink}} | |||
const url_href = window.location.pathname.split('create')[0] | |||
let nameMap,nameList | |||
@@ -217,7 +217,7 @@ td, th { | |||
<a class="item load-model-file" data-tab="third" data-download-flag="{{$.canDownload}}" data-path="{{$.RepoLink}}/modelarts/inference-job/{{.JobID}}/result_list" data-version="{{.VersionName}}" data-parents="" data-filename="" data-init="init" >{{$.i18n.Tr "repo.model_download"}}</a> | |||
</div> | |||
<div class="ui tab active" data-tab="first" style="height:400px"> | |||
<div class="ui tab active" data-tab="first"> | |||
<div style="padding-top: 10px;"> | |||
<div class="tab_2_content"> | |||
<div class="ac-grid ac-grid-col2"> | |||
@@ -402,19 +402,7 @@ td, th { | |||
</div> | |||
</td> | |||
</tr> | |||
<tr class="ti-no-ng-animate"> | |||
<td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||
{{$.i18n.Tr "repo.modelarts.infer_dataset"}} | |||
</td> | |||
<td class="ti-text-form-content"> | |||
<div class="text-span text-span-w"> | |||
{{range $m ,$n := $.datasetDownload}} | |||
<a href="{{.RepositoryLink}}" target="_blank">{{.DatasetName}}</a> | |||
{{end}} | |||
</div> | |||
</td> | |||
</tr> | |||
<tr class="ti-no-ng-animate"> | |||
<td class="ti-no-ng-animate ti-text-form-label text-width80" > | |||
{{$.i18n.Tr "repo.modelarts.train_job.run_parameter"}} | |||
@@ -445,6 +433,22 @@ td, th { | |||
</table> | |||
</div> | |||
</div> | |||
<div style="clear:both"> | |||
<table style="border:none" class="ui fixed small stackable table"> | |||
<thead> | |||
<tr><th style="color: #8a8e99;font-size:12px" class="three wide left aligned">{{$.i18n.Tr "dataset.file"}}</th> | |||
</tr></thead> | |||
<tbody> | |||
{{range $m ,$n := $.datasetDownload}} | |||
<tr> | |||
<td style="word-wrap: break-word;word-break: break-all;"><a href="{{.RepositoryLink}}" target="_blank">{{.DatasetName}}</a></td> | |||
</tr> | |||
{{end}} | |||
</tbody> | |||
</table> | |||
</div> | |||
</div> | |||
</div> | |||
@@ -123,11 +123,10 @@ | |||
}) | |||
} | |||
validate(); | |||
let createFlag = false | |||
form.onsubmit = function(e){ | |||
if(createFlag) return false | |||
let value_task = $("input[name='display_job_name']").val() | |||
let re = /^[a-z0-9][a-z0-9-_]{1,34}[a-z0-9-]$/ | |||
let flag = re.test(value_task) | |||
if(!flag){ | |||
@@ -136,11 +135,10 @@ | |||
$('#messageInfo p').text(str) | |||
return false | |||
} | |||
let min_value_task = value_task.toLowerCase() | |||
$("input[name='display_job_name']").attr("value",min_value_task) | |||
document.getElementById("mask").style.display = "block" | |||
createFlag = true | |||
} | |||
// 点击按钮后遮罩层显示 | |||
@@ -432,9 +432,9 @@ | |||
<div style="clear:both"> | |||
<table style="border:none" class="ui fixed small stackable table"> | |||
<thead> | |||
<tr><th style="color: #8a8e99;font-size:12px" class="three wide center aligned">数据集文件</th> | |||
<th style="color: #8a8e99;font-size:12px"class="eleven wide">数据集下载地址</th> | |||
<th style="color: #8a8e99;font-size:12px" class="two wide center aligned">操作</th> | |||
<tr><th style="color: #8a8e99;font-size:12px" class="three wide center aligned">{{$.i18n.Tr "dataset.file"}}</th> | |||
<th style="color: #8a8e99;font-size:12px"class="eleven wide">{{$.i18n.Tr "dataset.download_url"}}</th> | |||
<th style="color: #8a8e99;font-size:12px" class="two wide center aligned">{{$.i18n.Tr "dataset.download_oper"}}</th> | |||
</tr></thead> | |||
<tbody> | |||
{{range $.datasetDownload}} | |||
@@ -95,7 +95,7 @@ | |||
<span>{{$.i18n.Tr "repo.cloudbrain_status_runtime"}}</span> | |||
</div> | |||
<div class="two wide column text center padding0"> | |||
<span>{{$.i18n.Tr "repo.modelarts.computing_resources"}}</span> | |||
<span>{{$.i18n.Tr "repo.modelarts.cluster.computing_resources"}}</span> | |||
</div> | |||
<div class="one wide column text center padding0"> | |||
<span>{{$.i18n.Tr "repo.cloudbrain_creator"}}</span> | |||
@@ -137,7 +137,13 @@ | |||
</div> | |||
<!-- 计算资源 --> | |||
<div class="two wide column text center padding0"> | |||
<span style="font-size: 12px;">{{.ComputeResource}}</span> | |||
<span style="font-size: 12px;"> | |||
{{if eq .Cloudbrain.Type 2}} | |||
{{$.i18n.Tr "cloudbrain.resource_cluster_c2net_simple"}} | |||
{{else}} | |||
{{$.i18n.Tr "cloudbrain.resource_cluster_openi_simple"}} | |||
{{end}} | |||
{{.ComputeResource}}</span> | |||
</div> | |||
<!-- 创建者 --> | |||
<div class="one wide column text center padding0"> | |||
@@ -69,7 +69,7 @@ | |||
</h4> | |||
<div class="ui attached segment"> | |||
<!-- equal width --> | |||
<form class="ui form" action="{{.Link}}" method="post"> | |||
<form id="form_id" class="ui form" action="{{.Link}}" method="post"> | |||
{{.CsrfTokenHtml}} | |||
<input type="hidden" name="action" value="update"> | |||
<input type="hidden" id="ai_engine_name" name="engine_names" value=""> | |||
@@ -111,11 +111,14 @@ | |||
Ascend NPU</a> | |||
</div> | |||
{{template "custom/wait_count_train" Dict "ctx" $}} | |||
<div style="display: flex;align-items: center;margin-left: 155px;margin-top: 0.5rem;"> | |||
<i class="ri-error-warning-line" style="color: #f2711c;margin-right: 0.5rem;"></i> | |||
<span style="color: #888;font-size: 12px;">{{.i18n.Tr "cloudbrain.train_dataset_path_rule" | Safe}}</span> | |||
</div> | |||
</div> | |||
<div class="required inline min_title field"> | |||
<label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.job_name"}}</label> | |||
<input style="width: 60%;" name="display_job_name" id="display_job_name" placeholder={{.i18n.Tr "repo.modelarts.train_job.job_name"}} value="{{.display_job_name}}" tabindex="3" onkeyup="this.value=this.value.replace(/[, ]/g,'')" autofocus required maxlength="36"> | |||
<span class="tooltips" style="margin-left:11.5rem;display: block;">{{.i18n.Tr "repo.cloudbrain_jobname_err"}}</span> | |||
</div> | |||
<div class="inline min_title field"> | |||
@@ -204,7 +207,7 @@ | |||
<div id="select-multi-dataset"> | |||
</div> | |||
<span class="tooltips" style="margin-left: 11.5rem;margin-bottom: 1rem;">{{.i18n.Tr "cloudbrain.dataset_path_rule"}}</span> | |||
<span class="tooltips" style="margin-left: 11.5rem;margin-bottom: 1rem;"></span> | |||
<div class="inline min_title field"> | |||
<label class="label-fix-width" style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.run_parameter"}}</label> | |||
<span id="add_run_para" style="margin-left: 0.5rem;cursor:pointer;color: rgba(3, 102, 214, 100);font-size: 14px;line-height: 26px;font-family: SourceHanSansSC-medium;"><i class="plus square outline icon"></i>{{.i18n.Tr "repo.modelarts.train_job.add_run_parameter"}}</span> | |||
@@ -309,6 +312,12 @@ | |||
{{template "base/footer" .}} | |||
<script> | |||
let form = document.getElementById('form_id'); | |||
let createFlag = false | |||
form.onsubmit = function (e) { | |||
if(createFlag) return false | |||
createFlag = true | |||
} | |||
let url_href = window.location.pathname.split('create')[0] | |||
$(".ui.button").attr('href', url_href) | |||
$('select.dropdown') | |||
@@ -321,20 +330,6 @@ | |||
case 13:return false; | |||
} | |||
}); | |||
// let sever_num = $("#trainjob_work_server_num_select .text").text() //$('#trainjob_work_server_num') | |||
// console.log("sever_num:",sever_num) | |||
// $('.add').click(function(){ | |||
// sever_num.val(parseInt(sever_num.val())+1) | |||
// if(sever_num.val()>=26){ | |||
// sever_num.val(parseInt(sever_num.val())-1) | |||
// } | |||
// }) | |||
// $('.min').click(function(){ | |||
// sever_num.val(parseInt(sever_num.val())-1) | |||
// if(sever_num.val()<=0){ | |||
// sever_num.val(parseInt(sever_num.val())+1) | |||
// } | |||
// }) | |||
// 参数增加、删除、修改、保存 | |||
function Add_parameter(i) { | |||
value = '<div class="two fields width85" id= "para' + i + '">' + | |||
@@ -274,10 +274,14 @@ | |||
{{if .CanDel}} | |||
<a class="ti-action-menu-item" onclick="deleteVersion({{.VersionName}})" | |||
<a class='ti-action-menu-item delete-show-version {{if eq .Status "CREATING" "STOPPING" "WAITING" "STARTING" "RUNNING" "KILLING" "INIT"}}disabled {{end}}' | |||
id="{{.VersionName}}-delete" | |||
data-jobid="{{.JobID}}" | |||
data-repopath="{{$.RepoRelPath}}/modelarts/train-job" | |||
data-version = "{{.VersionName}}" | |||
style="color: #FF4D4F;">{{$.i18n.Tr "repo.delete"}}</a> | |||
{{else}} | |||
<a class="ti-action-menu-item disabled" onclick="deleteVersion({{.VersionName}})" | |||
<a class="ti-action-menu-item disabled" | |||
style="color: #FF4D4F;">{{$.i18n.Tr "repo.delete"}}</a> | |||
{{end}} | |||
</div> | |||
@@ -397,16 +401,7 @@ | |||
</div> | |||
</td> | |||
</tr> | |||
<tr class="ti-no-ng-animate"> | |||
<td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||
{{$.i18n.Tr "repo.modelarts.train_job.compute_node"}} | |||
</td> | |||
<td class="ti-text-form-content"> | |||
<div class="text-span text-span-w"> | |||
{{.WorkServerNumber}} | |||
</div> | |||
</td> | |||
</tr> | |||
</tbody> | |||
</table> | |||
</div> | |||
@@ -445,23 +440,7 @@ | |||
</div> | |||
</td> | |||
</tr> | |||
<tr class="ti-no-ng-animate"> | |||
<td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||
{{$.i18n.Tr "repo.modelarts.train_job.train_dataset"}} | |||
</td> | |||
<td class="ti-text-form-content"> | |||
<div class="text-span text-span-w"> | |||
{{range $m ,$n := $.datasetList}} | |||
{{if eq $k $m}} | |||
{{range $f ,$g := $n}} | |||
<a href="{{.RepositoryLink}}" target="_blank">{{.DatasetName}}</a> | |||
{{end}} | |||
{{end}} | |||
{{end}} | |||
</div> | |||
</td> | |||
</tr> | |||
<tr class="ti-no-ng-animate"> | |||
<td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||
{{$.i18n.Tr "repo.modelarts.train_job.run_parameter"}} | |||
@@ -486,10 +465,38 @@ | |||
</div> | |||
</td> | |||
</tr> | |||
<tr class="ti-no-ng-animate"> | |||
<td class="ti-no-ng-animate ti-text-form-label text-width80"> | |||
{{$.i18n.Tr "repo.modelarts.train_job.compute_node"}} | |||
</td> | |||
<td class="ti-text-form-content"> | |||
<div class="text-span text-span-w"> | |||
{{.WorkServerNumber}} | |||
</div> | |||
</td> | |||
</tr> | |||
</tbody> | |||
</table> | |||
</div> | |||
</div> | |||
<div style="clear:both"> | |||
<table style="border:none" class="ui fixed small stackable table"> | |||
<thead> | |||
<tr><th style="color: #8a8e99;font-size:12px" class="three wide left aligned">{{$.i18n.Tr "dataset.file"}}</th> | |||
</tr></thead> | |||
<tbody> | |||
{{range $m ,$n := $.datasetList}} | |||
{{if eq $k $m}} | |||
{{range $f ,$g := $n}} | |||
<tr> | |||
<td style="word-wrap: break-word;word-break: break-all;"><a href="{{.RepositoryLink}}" target="_blank">{{.DatasetName}}</a></td> | |||
</tr> | |||
{{end}} | |||
{{end}} | |||
{{end}} | |||
</tbody> | |||
</table> | |||
</div> | |||
</div> | |||
</div> | |||
@@ -896,35 +903,7 @@ | |||
$('#name').val(modelName) | |||
$('#version').val("0.0.1") | |||
} | |||
function deleteVersion(version_name) { | |||
stopBubbling(arguments.callee.caller.arguments[0]) | |||
let flag = 1; | |||
$('.ui.basic.modal').modal({ | |||
onDeny: function () { | |||
flag = false | |||
}, | |||
onApprove: function () { | |||
$.post(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/del_version`, { version_name: version_name }, (data) => { | |||
if (data.VersionListCount === 0) { | |||
location.href = `/${userName}/${repoPath}/modelarts/train-job` | |||
} else { | |||
$('#accordion' + version_name).remove() | |||
} | |||
}).fail(function (err) { | |||
console.log(err); | |||
}); | |||
flag = true | |||
}, | |||
onHidden: function () { | |||
if (flag == false) { | |||
$('.alert').html('您已取消操作').removeClass('alert-success').addClass('alert-danger').show().delay(1500).fadeOut(); | |||
} | |||
} | |||
}) | |||
.modal('show') | |||
} | |||
@@ -55,6 +55,7 @@ | |||
<div class="repository"> | |||
{{template "repo/header" .}} | |||
<div class="ui container"> | |||
<div class="cloudbrain-type" style="display: none;" data-cloudbrain-type="{{.datasetType}}" data-repo-link="{{.RepoLink}}" data-dataset-uuid="{{.uuid}}" data-dataset-name="{{.dataset_name}}"></div> | |||
{{template "base/alert" .}} | |||
<h4 class="ui top attached header"> | |||
{{.i18n.Tr "repo.modelarts.train_job.new"}} | |||
@@ -72,6 +73,11 @@ | |||
<input type="hidden" id="ai_engine_name" name="engine_names" value=""> | |||
<input type="hidden" id="ai_flaver_name" name="flaver_names" value=""> | |||
<input type="hidden" id="display_job_name" name="display_job_name" value="{{.display_job_name}}"> | |||
{{template "custom/wait_count_train" Dict "ctx" $}} | |||
<div style="display: flex;align-items: center;margin-left: 155px;margin-top: 0.5rem;"> | |||
<i class="ri-error-warning-line" style="color: #f2711c;margin-right: 0.5rem;"></i> | |||
<span style="color: #888;font-size: 12px;">{{.i18n.Tr "cloudbrain.train_dataset_path_rule" | Safe}}</span> | |||
</div> | |||
<h4 class="unite title ui header ">{{.i18n.Tr "repo.modelarts.train_job.basic_info"}}:</h4> | |||
<div class="required unite min_title inline field"> | |||
<label style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.job_name"}}</label> | |||
@@ -151,22 +157,9 @@ | |||
</span> | |||
<a href="https://git.openi.org.cn/OpenIOSSG/MINIST_Example" target="_blank">{{.i18n.Tr "cloudbrain.view_sample"}}</a> | |||
</div> | |||
<div class="required unite min_title inline field"> | |||
<label style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.dataset"}}</label> | |||
<select class="ui dropdown width80" id="trainjob_datasets" name="attachment" placeholder="{{.i18n.Tr "cloudbrain.select_dataset"}}"> | |||
{{if .dataset_name}} | |||
<option name="attachment" value="{{.uuid}}">{{.dataset_name}}</option> | |||
{{end}} | |||
{{range .attachments}} | |||
<option value="">{{$.i18n.Tr "cloudbrain.select_dataset"}}</option> | |||
{{if ne $.uuid .UUID}} | |||
<option name="attachment" value="{{.UUID}}">{{.Attachment.Name}}</option> | |||
{{end}} | |||
{{end}} | |||
</select> | |||
<span class="tooltips">{{.i18n.Tr "cloudbrain.dataset_path_rule"}}</span> | |||
</div> | |||
<div id="select-multi-dataset"> | |||
</div> | |||
<div class="inline unite min_title field"> | |||
<label style="font-weight: normal;">{{.i18n.Tr "repo.modelarts.train_job.run_parameter"}}</label> | |||
<span id="add_run_para" style="margin-left: 0.5rem;cursor:pointer;color: rgba(3, 102, 214, 100);font-size: 14px;line-height: 26px;font-family: SourceHanSansSC-medium;"><i class="plus square outline icon"></i>{{.i18n.Tr "repo.modelarts.train_job.add_run_parameter"}}</span> | |||
@@ -595,6 +595,8 @@ export default { | |||
confirmFlag: false, | |||
saveStatusList: [], | |||
// 初始化已选择的数据集列表 | |||
hasSelectDatasetList: [], | |||
//当前项目数据集页面配置的初始化 | |||
initCurrentPage: 1, | |||
totalNumCurrent: 0, | |||
@@ -653,6 +655,7 @@ export default { | |||
//tree 勾选触发事件 | |||
onCheck(data, checkedInfo) { | |||
this.hasSelectDatasetList = []; | |||
if ( | |||
this.selectDatasetArray.length === 0 || | |||
this.selectDatasetArray.every((item) => item.id !== data.id) | |||
@@ -680,9 +683,8 @@ export default { | |||
return item.label; | |||
}); | |||
this.saveStatusList = this.selectDatasetArray.map((item) => { | |||
return item.UUID; | |||
return item.id; | |||
}); | |||
// this.confirmDatasetList = this.saveStatusList.join(";"); | |||
}, | |||
//已选择数据集checkbox group 勾选事件 | |||
changeCheckbox(checked, data) { | |||
@@ -695,7 +697,6 @@ export default { | |||
}); | |||
this.selectDatasetArray.splice(index, 1); | |||
this.saveStatusList.splice(index, 1); | |||
// this.confirmDatasetList = this.saveStatusList.join(";"); | |||
}, | |||
tableHeaderStyle({ row, column, rowIndex, columnIndex }) { | |||
if (rowIndex === 0) { | |||
@@ -744,7 +745,10 @@ export default { | |||
let setCheckedKeysList = this.currentDatasetList.reduce( | |||
(pre, cur) => { | |||
cur.Attachments.forEach((item) => { | |||
if (this.saveStatusList.includes(item.id)) { | |||
if ( | |||
this.saveStatusList.includes(item.id) || | |||
this.hasSelectDatasetList.includes(item.id) | |||
) { | |||
pre.push(item.id); | |||
} | |||
}); | |||
@@ -967,11 +971,35 @@ export default { | |||
mounted() { | |||
this.type = $(".cloudbrain-type").data("cloudbrain-type"); | |||
this.repoLink = $(".cloudbrain-type").data("repo-link"); | |||
console.log("this.repolink", this.repoLink); | |||
if ($(".cloudbrain-type").data("dataset-uuid")) { | |||
this.hasSelectDatasetList = $(".cloudbrain-type") | |||
.data("dataset-uuid") | |||
.split(";"); | |||
let hasSelectDatasetName = $(".cloudbrain-type") | |||
.data("dataset-name") | |||
.split(";"); | |||
if (this.hasSelectDatasetList.length !== 0) { | |||
this.saveStatusList = this.hasSelectDatasetList; | |||
this.checkList = hasSelectDatasetName; | |||
this.hasSelectDatasetList.forEach((item, index) => { | |||
this.selectDatasetArray.push({ | |||
id: item, | |||
label: hasSelectDatasetName[index], | |||
}); | |||
}); | |||
} | |||
this.confirmDataset(); | |||
} | |||
if ( | |||
location.href.indexOf("benchmark") !== -1 || | |||
location.href.indexOf("train-job") !== -1 | |||
location.href.indexOf("train-job") !== -1 || | |||
location.href.indexOf("inference") !== -1 | |||
) { | |||
console.log("this.benchmarkNew"); | |||
this.benchmarkNew = true; | |||
} | |||
if ( | |||
@@ -213,6 +213,35 @@ export default async function initCloudrainSow() { | |||
}); | |||
e.stopPropagation(); | |||
}); | |||
$(".delete-show-version").click(function (e) { | |||
const ID = this.dataset.jobid; | |||
const repoPath = this.dataset.repopath; | |||
const version_name = this.dataset.version; | |||
const url = `/api/v1/repos/${repoPath}/${ID}/del_version`; | |||
$(".ui.basic.modal") | |||
.modal({ | |||
onApprove: function () { | |||
$.post(url, { version_name: version_name }, (data) => { | |||
console.log(data); | |||
if (data.StatusOK === 0) { | |||
if (data.VersionListCount === 0) { | |||
location.href = `/${repoPath}`; | |||
} else { | |||
$("#accordion" + version_name).remove(); | |||
} | |||
refreshStatusShow(version_name, ID, repoPath); | |||
} else { | |||
return; | |||
} | |||
}).fail(function (err) { | |||
console.log(err); | |||
}); | |||
}, | |||
}) | |||
.modal("show"); | |||
e.stopPropagation(); | |||
}); | |||
function refreshStatusShow(version_name, ID, repoPath) { | |||
$.get( | |||
`/api/v1/repos/${repoPath}/${ID}?version_name=${version_name}`, | |||
@@ -182,6 +182,15 @@ export default async function initCloudrain() { | |||
"CREATE_FAILED", | |||
"STOPPED", | |||
]; | |||
let deleteArray = [ | |||
"KILLED", | |||
"FAILED", | |||
"START_FAILED", | |||
"COMPLETED", | |||
"SUCCEEDED", | |||
"CREATE_FAILED", | |||
"STOPPED", | |||
]; | |||
$.get( | |||
`/api/v1/repos/${repoPath}/${jobID}?version_name=${versionname}`, | |||
(data) => { | |||
@@ -194,6 +203,10 @@ export default async function initCloudrain() { | |||
if (stopArray.includes(data.JobStatus)) { | |||
$("#" + versionname + "-stop").addClass("disabled"); | |||
} | |||
if (deleteArray.includes(data.JobStatus)) { | |||
$(`#${versionname}-delete`).removeClass("disabled"); | |||
$(`#${versionname}-delete`).addClass("blue"); | |||
} | |||
if (data.JobStatus === "COMPLETED") { | |||
$("#" + versionname + "-create-model") | |||
.removeClass("disabled") | |||
@@ -3525,7 +3525,7 @@ function initVueComponents() { | |||
`${self.reposFilter}:${self.archivedFilter}:${self.privateFilter}`, | |||
count | |||
); | |||
self.finalPage = Math.floor(count / self.searchLimit) + 1; | |||
self.finalPage = Math.ceil(count / self.searchLimit); | |||
self.updateHistory(); | |||
} | |||
}).always(() => { | |||
@@ -5101,7 +5101,7 @@ function initChartsNpu() { | |||
axisLabel: { | |||
interval: "auto", | |||
}, | |||
name: "时间(min)", | |||
name: "", | |||
}, | |||
yAxis: { | |||
show: true, | |||
@@ -5157,7 +5157,9 @@ function initChartsNpu() { | |||
}; | |||
return seriesOption; | |||
}); | |||
let xAxisValue = res.Interval === 1 ? "时间(min)" : "时间(hour)"; | |||
let xLength = res.MetricsInfo[0].value.length; | |||
options.xAxis.name = xAxisValue; | |||
options.xAxis.data = Array.from( | |||
{ length: xLength }, | |||
(_, index) => index | |||
@@ -100,7 +100,7 @@ | |||
} | |||
.issue.title { | |||
width: 80%; | |||
width: 100%; | |||
} | |||
.push.news .content ul { | |||