From 55970e9dbc9f9885baa08989d451b97bc5f5f0e6 Mon Sep 17 00:00:00 2001 From: zouap Date: Mon, 30 May 2022 11:12:24 +0800 Subject: [PATCH 001/424] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- models/cloudbrain.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/cloudbrain.go b/models/cloudbrain.go index 480350c8d..db91875ef 100755 --- a/models/cloudbrain.go +++ b/models/cloudbrain.go @@ -1300,7 +1300,7 @@ func QueryModelTrainJobList(repoId int64) ([]*CloudbrainInfo, int, error) { builder.Eq{"repo_id": repoId}, ) cond = cond.And( - builder.Eq{"Status": "COMPLETED"}, + builder.In("Status", "COMPLETED", "SUCCEEDED"), ) cond = cond.And( builder.Eq{"job_type": "TRAIN"}, From 8bc64ef9eed90df35c53d27756833fe23fbd2ed0 Mon Sep 17 00:00:00 2001 From: zouap Date: Mon, 30 May 2022 11:13:31 +0800 Subject: [PATCH 002/424] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0GPU=E8=AE=AD=E7=BB=83=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=A8=A1=E5=9E=8B=E9=80=89=E6=8B=A9=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- models/cloudbrain.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/models/cloudbrain.go b/models/cloudbrain.go index db91875ef..9f517b51d 100755 --- a/models/cloudbrain.go +++ b/models/cloudbrain.go @@ -1279,7 +1279,8 @@ func QueryModelTrainJobVersionList(jobId string) ([]*CloudbrainInfo, int, error) builder.Eq{"cloudbrain.job_id": jobId}, ) cond = cond.And( - builder.Eq{"cloudbrain.Status": "COMPLETED"}, + builder.In("cloudbrain.Status", "COMPLETED", "SUCCEEDED"), + //builder.Eq{"cloudbrain.Status": "COMPLETED"}, ) sess.OrderBy("cloudbrain.created_unix DESC") From 90558a4c611bd6c909e89ef1fea7be8a2f5ab64e Mon Sep 17 00:00:00 2001 From: zouap Date: Mon, 30 May 2022 14:22:22 +0800 Subject: [PATCH 003/424] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- modules/storage/minio_ext.go | 33 +++++++++++++++++++++++++++++++++ routers/repo/ai_model_manage.go | 17 +++++++++++++++-- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/modules/storage/minio_ext.go b/modules/storage/minio_ext.go index 167cd0488..9e9c91573 100755 --- a/modules/storage/minio_ext.go +++ b/modules/storage/minio_ext.go @@ -116,6 +116,39 @@ func GenMultiPartSignedUrl(uuid string, uploadId string, partNumber int, partSiz } +func MinioPathCopy(bucketName string, srcPath string, destPath string) (int64, error) { + _, core, err := getClients() + var count int64 + count = 0 + if err != nil { + log.Error("getClients failed:", err.Error()) + return count, err + } + delimiter := "" + marker := "" + for { + output, err := core.ListObjects(bucketName, srcPath, marker, delimiter, 1000) + if err == nil { + for _, val := range output.Contents { + srcObjectName := val.Key + destObjectName := destPath + srcObjectName[len(srcPath):] + log.Info("srcObjectName=" + srcObjectName + " destObjectName=" + destObjectName) + core.CopyObject(bucketName, srcObjectName, bucketName, destObjectName, val.UserMetadata) + count++ + } + if output.IsTruncated { + marker = output.NextMarker + } else { + break + } + } else { + log.Info("list error." + err.Error()) + return 0, err + } + } + return count, nil +} + func NewMultiPartUpload(uuid string) (string, error) { _, core, err := getClients() if err != nil { diff --git a/routers/repo/ai_model_manage.go b/routers/repo/ai_model_manage.go index e2040e0d2..ed882ffd7 100644 --- a/routers/repo/ai_model_manage.go +++ b/routers/repo/ai_model_manage.go @@ -39,7 +39,6 @@ func saveModelByParameters(jobId string, versionName string, name string, versio modelPath := id var lastNewModelId string var modelSize int64 - cloudType := models.TypeCloudBrainTwo log.Info("find task name:" + aiTask.JobName) aimodels := models.QueryModelByName(name, aiTask.RepoID) @@ -53,7 +52,7 @@ func saveModelByParameters(jobId string, versionName string, name string, versio } } } - cloudType = aiTask.Type + cloudType := aiTask.Type //download model zip //train type if cloudType == models.TypeCloudBrainTwo { modelPath, modelSize, err = downloadModelFromCloudBrainTwo(id, aiTask.JobName, "", aiTask.TrainUrl) @@ -61,6 +60,8 @@ func saveModelByParameters(jobId string, versionName string, name string, versio log.Info("download model from CloudBrainTwo faild." + err.Error()) return err } + } else if cloudType == models.TypeCloudBrainOne { + } accuracy := make(map[string]string) accuracy["F1"] = "" @@ -199,6 +200,18 @@ func downloadModelFromCloudBrainTwo(modelUUID string, jobName string, parentDir return dataActualPath, size, nil } +func downloadModelFromCloudBrainOne(modelUUID string, jobName string, parentDir string, trainUrl string) (string, int64, error) { + modelActualPath := storage.GetMinioPath(jobName, "/model/") + destKeyNamePrefix := Model_prefix + models.AttachmentRelativePath(modelUUID) + "/" + size, err := storage.MinioPathCopy(setting.Bucket, modelActualPath, destKeyNamePrefix) + if err == nil { + dataActualPath := setting.Bucket + "/" + destKeyNamePrefix + return dataActualPath, size, nil + } else { + return "", 0, nil + } +} + func DeleteModel(ctx *context.Context) { log.Info("delete model start.") id := ctx.Query("ID") From f067782abb33f415975995b93eb513da8935e437 Mon Sep 17 00:00:00 2001 From: zouap Date: Mon, 30 May 2022 15:08:38 +0800 Subject: [PATCH 004/424] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- routers/repo/ai_model_manage.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/routers/repo/ai_model_manage.go b/routers/repo/ai_model_manage.go index ed882ffd7..78d2e1327 100644 --- a/routers/repo/ai_model_manage.go +++ b/routers/repo/ai_model_manage.go @@ -61,7 +61,11 @@ func saveModelByParameters(jobId string, versionName string, name string, versio return err } } else if cloudType == models.TypeCloudBrainOne { - + modelPath, modelSize, err = downloadModelFromCloudBrainOne(id, aiTask.JobName, "", aiTask.TrainUrl) + if err != nil { + log.Info("download model from CloudBrainOne faild." + err.Error()) + return err + } } accuracy := make(map[string]string) accuracy["F1"] = "" @@ -290,7 +294,15 @@ func DownloadMultiModelFile(ctx *context.Context) { } path := Model_prefix + models.AttachmentRelativePath(id) + "/" + if task.Type == models.TypeCloudBrainTwo { + + } else if task.Type == models.TypeCloudBrainOne { + + } + +} +func downloadFromCloudBrainTwo(path string, task *models.AiModelManage, ctx *context.Context, id string) { allFile, err := storage.GetAllObjectByBucketAndPrefix(setting.Bucket, path) if err == nil { //count++ From 3075b8c23fc1826bce888c805e691c092ef31c8e Mon Sep 17 00:00:00 2001 From: zouap Date: Mon, 30 May 2022 15:41:20 +0800 Subject: [PATCH 005/424] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- modules/storage/minio_ext.go | 101 ++++++++++++++++++++++++++++++++ routers/repo/ai_model_manage.go | 58 +++++++++++++++++- 2 files changed, 156 insertions(+), 3 deletions(-) diff --git a/modules/storage/minio_ext.go b/modules/storage/minio_ext.go index 9e9c91573..6aeaec623 100755 --- a/modules/storage/minio_ext.go +++ b/modules/storage/minio_ext.go @@ -116,6 +116,107 @@ func GenMultiPartSignedUrl(uuid string, uploadId string, partNumber int, partSiz } +func GetAllObjectByBucketAndPrefixMinio(bucket string, prefix string) ([]FileInfo, error) { + _, core, err := getClients() + if err != nil { + log.Error("getClients failed:", err.Error()) + return nil, err + } + prefixLen := len(prefix) + delimiter := "" + marker := "" + index := 1 + fileInfoList := FileInfoList{} + for { + output, err := core.ListObjects(bucket, prefix, marker, delimiter, 1000) + if err == nil { + log.Info("Page:%d\n", index) + index++ + for _, val := range output.Contents { + var isDir bool + if prefixLen == len(val.Key) { + continue + } + if strings.HasSuffix(val.Key, "/") { + isDir = true + } else { + isDir = false + } + fileInfo := FileInfo{ + ModTime: val.LastModified.Format("2006-01-02 15:04:05"), + FileName: val.Key[prefixLen:], + Size: val.Size, + IsDir: isDir, + ParenDir: "", + } + fileInfoList = append(fileInfoList, fileInfo) + } + if output.IsTruncated { + marker = output.NextMarker + } else { + break + } + } else { + log.Info("list error." + err.Error()) + return nil, err + } + } + sort.Sort(fileInfoList) + return fileInfoList, nil +} + +func GetOneLevelAllObjectUnderDirMinio(bucket string, prefixRootPath string, relativePath string) ([]FileInfo, error) { + _, core, err := getClients() + if err != nil { + log.Error("getClients failed:", err.Error()) + return nil, err + } + + Prefix := prefixRootPath + relativePath + if !strings.HasSuffix(Prefix, "/") { + Prefix += "/" + } + output, err := core.ListObjects(bucket, Prefix, "", "", 1000) + fileInfos := make([]FileInfo, 0) + prefixLen := len(Prefix) + if err == nil { + for _, val := range output.Contents { + log.Info("val key=" + val.Key) + var isDir bool + var fileName string + if val.Key == Prefix { + continue + } + if strings.Contains(val.Key[prefixLen:len(val.Key)-1], "/") { + continue + } + if strings.HasSuffix(val.Key, "/") { + isDir = true + fileName = val.Key[prefixLen : len(val.Key)-1] + relativePath += val.Key[prefixLen:] + } else { + isDir = false + fileName = val.Key[prefixLen:] + } + fileInfo := FileInfo{ + ModTime: val.LastModified.Local().Format("2006-01-02 15:04:05"), + FileName: fileName, + Size: val.Size, + IsDir: isDir, + ParenDir: relativePath, + } + fileInfos = append(fileInfos, fileInfo) + } + return fileInfos, err + } else { + + log.Error("Message:%s", err.Error()) + + return nil, err + } + +} + func MinioPathCopy(bucketName string, srcPath string, destPath string) (int64, error) { _, core, err := getClients() var count int64 diff --git a/routers/repo/ai_model_manage.go b/routers/repo/ai_model_manage.go index 78d2e1327..53030949e 100644 --- a/routers/repo/ai_model_manage.go +++ b/routers/repo/ai_model_manage.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "net/http" + "net/url" "path" "strings" @@ -295,13 +296,64 @@ func DownloadMultiModelFile(ctx *context.Context) { path := Model_prefix + models.AttachmentRelativePath(id) + "/" if task.Type == models.TypeCloudBrainTwo { - + downloadFromCloudBrainTwo(path, task, ctx, id) } else if task.Type == models.TypeCloudBrainOne { - + downloadFromCloudBrainOne(path, task, ctx, id) } } +func downloadFromCloudBrainOne(path string, task *models.AiModelManage, ctx *context.Context, id string) { + allFile, err := storage.GetAllObjectByBucketAndPrefix(setting.Bucket, path) + if err == nil { + //count++ + models.ModifyModelDownloadCount(id) + + returnFileName := task.Name + "_" + task.Version + ".zip" + ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+url.QueryEscape(returnFileName)) + ctx.Resp.Header().Set("Content-Type", "application/octet-stream") + w := zip.NewWriter(ctx.Resp) + defer w.Close() + for _, oneFile := range allFile { + if oneFile.IsDir { + log.Info("zip dir name:" + oneFile.FileName) + } else { + log.Info("zip file name:" + oneFile.FileName) + fDest, err := w.Create(oneFile.FileName) + if err != nil { + log.Info("create zip entry error, download file failed: %s\n", err.Error()) + ctx.ServerError("download file failed:", err) + return + } + body, err := storage.ObsDownloadAFile(setting.Bucket, path+oneFile.FileName) + if err != nil { + log.Info("download file failed: %s\n", err.Error()) + ctx.ServerError("download file failed:", err) + return + } else { + defer body.Close() + p := make([]byte, 1024) + var readErr error + var readCount int + // 读取对象内容 + for { + readCount, readErr = body.Read(p) + if readCount > 0 { + fDest.Write(p[:readCount]) + } + if readErr != nil { + break + } + } + } + } + } + } else { + log.Info("error,msg=" + err.Error()) + ctx.ServerError("no file to download.", err) + } +} + func downloadFromCloudBrainTwo(path string, task *models.AiModelManage, ctx *context.Context, id string) { allFile, err := storage.GetAllObjectByBucketAndPrefix(setting.Bucket, path) if err == nil { @@ -309,7 +361,7 @@ func downloadFromCloudBrainTwo(path string, task *models.AiModelManage, ctx *con models.ModifyModelDownloadCount(id) returnFileName := task.Name + "_" + task.Version + ".zip" - ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+returnFileName) + ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+url.QueryEscape(returnFileName)) ctx.Resp.Header().Set("Content-Type", "application/octet-stream") w := zip.NewWriter(ctx.Resp) defer w.Close() From bcb5f69d0377e36ca01e2cfd8184da355703c111 Mon Sep 17 00:00:00 2001 From: zouap Date: Mon, 30 May 2022 17:54:35 +0800 Subject: [PATCH 006/424] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=EF=BC=8C=E5=AF=B9minio=E6=A8=A1=E5=9E=8B=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- modules/storage/minio.go | 10 ++++++++++ modules/storage/minio_ext.go | 1 - routers/repo/ai_model_manage.go | 21 +++++++++++---------- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/modules/storage/minio.go b/modules/storage/minio.go index 7b914817d..47f70e12d 100755 --- a/modules/storage/minio.go +++ b/modules/storage/minio.go @@ -59,6 +59,16 @@ func (m *MinioStorage) buildMinioPath(p string) string { return strings.TrimPrefix(path.Join(m.basePath, p), "/") } +func (m *MinioStorage) DownloadAFile(bucket string, objectName string) (io.ReadCloser, error) { + + var opts = minio.GetObjectOptions{} + object, err := m.client.GetObject(m.bucket, objectName, opts) + if err != nil { + return nil, err + } + return object, nil +} + // Open open a file func (m *MinioStorage) Open(path string) (io.ReadCloser, error) { var opts = minio.GetObjectOptions{} diff --git a/modules/storage/minio_ext.go b/modules/storage/minio_ext.go index 6aeaec623..82efcc710 100755 --- a/modules/storage/minio_ext.go +++ b/modules/storage/minio_ext.go @@ -113,7 +113,6 @@ func GenMultiPartSignedUrl(uuid string, uploadId string, partNumber int, partSiz objectName := strings.TrimPrefix(path.Join(minio.BasePath, path.Join(uuid[0:1], uuid[1:2], uuid)), "/") return minioClient.GenUploadPartSignedUrl(uploadId, bucketName, objectName, partNumber, partSize, PresignedUploadPartUrlExpireTime, setting.Attachment.Minio.Location) - } func GetAllObjectByBucketAndPrefixMinio(bucket string, prefix string) ([]FileInfo, error) { diff --git a/routers/repo/ai_model_manage.go b/routers/repo/ai_model_manage.go index 53030949e..ef8c4b754 100644 --- a/routers/repo/ai_model_manage.go +++ b/routers/repo/ai_model_manage.go @@ -207,14 +207,15 @@ func downloadModelFromCloudBrainTwo(modelUUID string, jobName string, parentDir func downloadModelFromCloudBrainOne(modelUUID string, jobName string, parentDir string, trainUrl string) (string, int64, error) { modelActualPath := storage.GetMinioPath(jobName, "/model/") - destKeyNamePrefix := Model_prefix + models.AttachmentRelativePath(modelUUID) + "/" - size, err := storage.MinioPathCopy(setting.Bucket, modelActualPath, destKeyNamePrefix) - if err == nil { - dataActualPath := setting.Bucket + "/" + destKeyNamePrefix - return dataActualPath, size, nil - } else { - return "", 0, nil - } + log.Info("modelActualPath=" + modelActualPath) + //destKeyNamePrefix := Model_prefix + models.AttachmentRelativePath(modelUUID) + "/" + //size, err := storage.MinioPathCopy(setting.Bucket, modelActualPath, destKeyNamePrefix) + //if err == nil { + // dataActualPath := setting.Bucket + "/" + destKeyNamePrefix + // return dataActualPath, size, nil + //} else { + return "", 0, nil + //} } func DeleteModel(ctx *context.Context) { @@ -304,7 +305,7 @@ func DownloadMultiModelFile(ctx *context.Context) { } func downloadFromCloudBrainOne(path string, task *models.AiModelManage, ctx *context.Context, id string) { - allFile, err := storage.GetAllObjectByBucketAndPrefix(setting.Bucket, path) + allFile, err := storage.GetAllObjectByBucketAndPrefixMinio(setting.Attachment.Minio.Bucket, path) if err == nil { //count++ models.ModifyModelDownloadCount(id) @@ -325,7 +326,7 @@ func downloadFromCloudBrainOne(path string, task *models.AiModelManage, ctx *con ctx.ServerError("download file failed:", err) return } - body, err := storage.ObsDownloadAFile(setting.Bucket, path+oneFile.FileName) + body, err := storage.Attachments.Open(oneFile.FileName) if err != nil { log.Info("download file failed: %s\n", err.Error()) ctx.ServerError("download file failed:", err) From 6ac80be14ce1353f025088ef1bba15902499bf2e Mon Sep 17 00:00:00 2001 From: zouap Date: Tue, 31 May 2022 09:29:16 +0800 Subject: [PATCH 007/424] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- templates/repo/modelmanage/index.tmpl | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/templates/repo/modelmanage/index.tmpl b/templates/repo/modelmanage/index.tmpl index 73baa6c93..e65fbf004 100644 --- a/templates/repo/modelmanage/index.tmpl +++ b/templates/repo/modelmanage/index.tmpl @@ -248,8 +248,12 @@ if(data.length){ $("#job-version").append(train_html) $(".ui.dropdown.selection.search.width70").removeClass("loading") - $('#choice_version .default.text').text(data[0].VersionName) - $('#choice_version input[name="VersionName"]').val(data[0].VersionName) + var versionName = data[0].VersionName; + if(versionName==null || versionName==""){ + versionName="V0001"; + } + $('#choice_version .default.text').text(versionName) + $('#choice_version input[name="VersionName"]').val(versionName) } }) From 0bae82764609658bb01edf122b212e886f667f3f Mon Sep 17 00:00:00 2001 From: zouap Date: Tue, 31 May 2022 09:43:09 +0800 Subject: [PATCH 008/424] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- routers/repo/ai_model_manage.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/routers/repo/ai_model_manage.go b/routers/repo/ai_model_manage.go index ef8c4b754..375bbaaa6 100644 --- a/routers/repo/ai_model_manage.go +++ b/routers/repo/ai_model_manage.go @@ -31,10 +31,14 @@ const ( func saveModelByParameters(jobId string, versionName string, name string, version string, label string, description string, ctx *context.Context) error { aiTask, err := models.GetCloudbrainByJobIDAndVersionName(jobId, versionName) if err != nil { - log.Info("query task error." + err.Error()) - return err + aiTask, err = models.GetRepoCloudBrainByJobID(ctx.Repo.Repository.ID, jobId) + if err != nil { + log.Info("query task error." + err.Error()) + return err + } else { + log.Info("query gpu train task.") + } } - uuid := uuid.NewV4() id := uuid.String() modelPath := id From 0866da75780cd32d65a118f77f22a519f47de97c Mon Sep 17 00:00:00 2001 From: zouap Date: Tue, 31 May 2022 09:53:22 +0800 Subject: [PATCH 009/424] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- routers/repo/ai_model_manage.go | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/routers/repo/ai_model_manage.go b/routers/repo/ai_model_manage.go index 375bbaaa6..173966742 100644 --- a/routers/repo/ai_model_manage.go +++ b/routers/repo/ai_model_manage.go @@ -212,14 +212,16 @@ func downloadModelFromCloudBrainTwo(modelUUID string, jobName string, parentDir func downloadModelFromCloudBrainOne(modelUUID string, jobName string, parentDir string, trainUrl string) (string, int64, error) { modelActualPath := storage.GetMinioPath(jobName, "/model/") log.Info("modelActualPath=" + modelActualPath) - //destKeyNamePrefix := Model_prefix + models.AttachmentRelativePath(modelUUID) + "/" - //size, err := storage.MinioPathCopy(setting.Bucket, modelActualPath, destKeyNamePrefix) - //if err == nil { - // dataActualPath := setting.Bucket + "/" + destKeyNamePrefix - // return dataActualPath, size, nil - //} else { - return "", 0, nil - //} + modelSrcPrefix := setting.CBCodePathPrefix + jobName + "/model/" + destKeyNamePrefix := Model_prefix + models.AttachmentRelativePath(modelUUID) + "/" + log.Info("destKeyNamePrefix=" + destKeyNamePrefix + " modelSrcPrefix=" + modelSrcPrefix) + size, err := storage.MinioPathCopy(setting.Bucket, modelSrcPrefix, destKeyNamePrefix) + if err == nil { + dataActualPath := setting.Bucket + "/" + destKeyNamePrefix + return dataActualPath, size, nil + } else { + return "", 0, nil + } } func DeleteModel(ctx *context.Context) { From 8ffdd2113ba898a21b9511db6828fd34a849ef77 Mon Sep 17 00:00:00 2001 From: zouap Date: Tue, 31 May 2022 10:05:40 +0800 Subject: [PATCH 010/424] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- routers/repo/ai_model_manage.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/routers/repo/ai_model_manage.go b/routers/repo/ai_model_manage.go index 173966742..e7ce72e11 100644 --- a/routers/repo/ai_model_manage.go +++ b/routers/repo/ai_model_manage.go @@ -214,10 +214,11 @@ func downloadModelFromCloudBrainOne(modelUUID string, jobName string, parentDir log.Info("modelActualPath=" + modelActualPath) modelSrcPrefix := setting.CBCodePathPrefix + jobName + "/model/" destKeyNamePrefix := Model_prefix + models.AttachmentRelativePath(modelUUID) + "/" - log.Info("destKeyNamePrefix=" + destKeyNamePrefix + " modelSrcPrefix=" + modelSrcPrefix) - size, err := storage.MinioPathCopy(setting.Bucket, modelSrcPrefix, destKeyNamePrefix) + bucketName := setting.Attachment.Minio.Bucket + log.Info("destKeyNamePrefix=" + destKeyNamePrefix + " modelSrcPrefix=" + modelSrcPrefix + " bucket=" + bucketName) + size, err := storage.MinioPathCopy(bucketName, modelSrcPrefix, destKeyNamePrefix) if err == nil { - dataActualPath := setting.Bucket + "/" + destKeyNamePrefix + dataActualPath := bucketName + "/" + destKeyNamePrefix return dataActualPath, size, nil } else { return "", 0, nil From 086c12b9604d6c86cf6a41f936122e74c7c1a0c4 Mon Sep 17 00:00:00 2001 From: zouap Date: Tue, 31 May 2022 10:18:34 +0800 Subject: [PATCH 011/424] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- routers/repo/ai_model_manage.go | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/routers/repo/ai_model_manage.go b/routers/repo/ai_model_manage.go index e7ce72e11..a3a49af3a 100644 --- a/routers/repo/ai_model_manage.go +++ b/routers/repo/ai_model_manage.go @@ -774,9 +774,11 @@ func QueryModelFileForPredict(ctx *context.Context) { ctx.ServerError("no such model:", err) return } - prefix := model.Path[len(setting.Bucket)+1:] - fileinfos, err := storage.GetAllObjectByBucketAndPrefix(setting.Bucket, prefix) - ctx.JSON(http.StatusOK, fileinfos) + if model.Type == models.TypeCloudBrainTwo { + prefix := model.Path[len(setting.Bucket)+1:] + fileinfos, _ := storage.GetAllObjectByBucketAndPrefix(setting.Bucket, prefix) + ctx.JSON(http.StatusOK, fileinfos) + } } func QueryOneLevelModelFile(ctx *context.Context) { @@ -788,7 +790,14 @@ func QueryOneLevelModelFile(ctx *context.Context) { ctx.ServerError("no such model:", err) return } - prefix := model.Path[len(setting.Bucket)+1:] - fileinfos, err := storage.GetOneLevelAllObjectUnderDir(setting.Bucket, prefix, parentDir) - ctx.JSON(http.StatusOK, fileinfos) + if model.Type == models.TypeCloudBrainTwo { + prefix := model.Path[len(setting.Bucket)+1:] + fileinfos, _ := storage.GetOneLevelAllObjectUnderDir(setting.Bucket, prefix, parentDir) + ctx.JSON(http.StatusOK, fileinfos) + } else if model.Type == models.TypeCloudBrainOne { + prefix := model.Path[len(setting.Attachment.Minio.Bucket)+1:] + fileinfos, _ := storage.GetOneLevelAllObjectUnderDirMinio(setting.Attachment.Minio.Bucket, prefix, parentDir) + ctx.JSON(http.StatusOK, fileinfos) + } + } From 7206faf1c7212b9a62c966ac2e612076060639b7 Mon Sep 17 00:00:00 2001 From: zouap Date: Tue, 31 May 2022 10:23:36 +0800 Subject: [PATCH 012/424] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- modules/storage/minio_ext.go | 1 + routers/repo/ai_model_manage.go | 2 ++ 2 files changed, 3 insertions(+) diff --git a/modules/storage/minio_ext.go b/modules/storage/minio_ext.go index 82efcc710..cbbc0179b 100755 --- a/modules/storage/minio_ext.go +++ b/modules/storage/minio_ext.go @@ -175,6 +175,7 @@ func GetOneLevelAllObjectUnderDirMinio(bucket string, prefixRootPath string, rel if !strings.HasSuffix(Prefix, "/") { Prefix += "/" } + log.Info("bucket=" + bucket + " Prefix=" + Prefix) output, err := core.ListObjects(bucket, Prefix, "", "", 1000) fileInfos := make([]FileInfo, 0) prefixLen := len(Prefix) diff --git a/routers/repo/ai_model_manage.go b/routers/repo/ai_model_manage.go index a3a49af3a..4bc54bf5f 100644 --- a/routers/repo/ai_model_manage.go +++ b/routers/repo/ai_model_manage.go @@ -791,10 +791,12 @@ func QueryOneLevelModelFile(ctx *context.Context) { return } if model.Type == models.TypeCloudBrainTwo { + log.Info("TypeCloudBrainTwo list model file.") prefix := model.Path[len(setting.Bucket)+1:] fileinfos, _ := storage.GetOneLevelAllObjectUnderDir(setting.Bucket, prefix, parentDir) ctx.JSON(http.StatusOK, fileinfos) } else if model.Type == models.TypeCloudBrainOne { + log.Info("TypeCloudBrainOne list model file.") prefix := model.Path[len(setting.Attachment.Minio.Bucket)+1:] fileinfos, _ := storage.GetOneLevelAllObjectUnderDirMinio(setting.Attachment.Minio.Bucket, prefix, parentDir) ctx.JSON(http.StatusOK, fileinfos) From cf23e013ee02695416709c42967d7142902cb529 Mon Sep 17 00:00:00 2001 From: zouap Date: Tue, 31 May 2022 10:40:29 +0800 Subject: [PATCH 013/424] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- routers/repo/ai_model_manage.go | 65 ++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 26 deletions(-) diff --git a/routers/repo/ai_model_manage.go b/routers/repo/ai_model_manage.go index 4bc54bf5f..7a02a5322 100644 --- a/routers/repo/ai_model_manage.go +++ b/routers/repo/ai_model_manage.go @@ -459,42 +459,55 @@ func DownloadSingleModelFile(ctx *context.Context) { ctx.NotFound(ctx.Req.URL.RequestURI(), nil) return } - if setting.PROXYURL != "" { - body, err := storage.ObsDownloadAFile(setting.Bucket, path) - if err != nil { - log.Info("download error.") + if task.Type == models.TypeCloudBrainTwo { + if setting.PROXYURL != "" { + body, err := storage.ObsDownloadAFile(setting.Bucket, path) + if err != nil { + log.Info("download error.") + } else { + //count++ + models.ModifyModelDownloadCount(id) + defer body.Close() + ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+fileName) + ctx.Resp.Header().Set("Content-Type", "application/octet-stream") + p := make([]byte, 1024) + var readErr error + var readCount int + // 读取对象内容 + for { + readCount, readErr = body.Read(p) + if readCount > 0 { + ctx.Resp.Write(p[:readCount]) + //fmt.Printf("%s", p[:readCount]) + } + if readErr != nil { + break + } + } + } } else { + url, err := storage.GetObsCreateSignedUrlByBucketAndKey(setting.Bucket, path) + if err != nil { + log.Error("GetObsCreateSignedUrl failed: %v", err.Error(), ctx.Data["msgID"]) + ctx.ServerError("GetObsCreateSignedUrl", err) + return + } //count++ models.ModifyModelDownloadCount(id) - defer body.Close() - ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+fileName) - ctx.Resp.Header().Set("Content-Type", "application/octet-stream") - p := make([]byte, 1024) - var readErr error - var readCount int - // 读取对象内容 - for { - readCount, readErr = body.Read(p) - if readCount > 0 { - ctx.Resp.Write(p[:readCount]) - //fmt.Printf("%s", p[:readCount]) - } - if readErr != nil { - break - } - } + http.Redirect(ctx.Resp, ctx.Req.Request, url, http.StatusMovedPermanently) } - } else { - url, err := storage.GetObsCreateSignedUrlByBucketAndKey(setting.Bucket, path) + } else if task.Type == models.TypeCloudBrainOne { + log.Info("start to down load minio file.") + url, err := storage.Attachments.PresignedGetURL(path, fileName) if err != nil { - log.Error("GetObsCreateSignedUrl failed: %v", err.Error(), ctx.Data["msgID"]) - ctx.ServerError("GetObsCreateSignedUrl", err) + log.Error("Get minio get SignedUrl failed: %v", err.Error(), ctx.Data["msgID"]) + ctx.ServerError("Get minio get SignedUrl failed", err) return } - //count++ models.ModifyModelDownloadCount(id) http.Redirect(ctx.Resp, ctx.Req.Request, url, http.StatusMovedPermanently) } + } func ShowModelInfo(ctx *context.Context) { From 788764a51fe8bec061f62ff3bb2e29090bb3d158 Mon Sep 17 00:00:00 2001 From: zouap Date: Tue, 31 May 2022 10:46:23 +0800 Subject: [PATCH 014/424] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- modules/storage/minio_ext.go | 10 +++++----- routers/repo/ai_model_manage.go | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/storage/minio_ext.go b/modules/storage/minio_ext.go index cbbc0179b..514ac7204 100755 --- a/modules/storage/minio_ext.go +++ b/modules/storage/minio_ext.go @@ -219,11 +219,11 @@ func GetOneLevelAllObjectUnderDirMinio(bucket string, prefixRootPath string, rel func MinioPathCopy(bucketName string, srcPath string, destPath string) (int64, error) { _, core, err := getClients() - var count int64 - count = 0 + var fileTotalSize int64 + fileTotalSize = 0 if err != nil { log.Error("getClients failed:", err.Error()) - return count, err + return fileTotalSize, err } delimiter := "" marker := "" @@ -235,7 +235,7 @@ func MinioPathCopy(bucketName string, srcPath string, destPath string) (int64, e destObjectName := destPath + srcObjectName[len(srcPath):] log.Info("srcObjectName=" + srcObjectName + " destObjectName=" + destObjectName) core.CopyObject(bucketName, srcObjectName, bucketName, destObjectName, val.UserMetadata) - count++ + fileTotalSize += val.Size } if output.IsTruncated { marker = output.NextMarker @@ -247,7 +247,7 @@ func MinioPathCopy(bucketName string, srcPath string, destPath string) (int64, e return 0, err } } - return count, nil + return fileTotalSize, nil } func NewMultiPartUpload(uuid string) (string, error) { diff --git a/routers/repo/ai_model_manage.go b/routers/repo/ai_model_manage.go index 7a02a5322..a13095d52 100644 --- a/routers/repo/ai_model_manage.go +++ b/routers/repo/ai_model_manage.go @@ -333,7 +333,7 @@ func downloadFromCloudBrainOne(path string, task *models.AiModelManage, ctx *con ctx.ServerError("download file failed:", err) return } - body, err := storage.Attachments.Open(oneFile.FileName) + body, err := storage.Attachments.Open(path + oneFile.FileName) if err != nil { log.Info("download file failed: %s\n", err.Error()) ctx.ServerError("download file failed:", err) From 87375ce6cc68818c4b8d389742d6041cab755051 Mon Sep 17 00:00:00 2001 From: zouap Date: Tue, 31 May 2022 16:15:02 +0800 Subject: [PATCH 015/424] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2=E4=BB=BB=E5=8A=A1=E7=95=8C=E9=9D=A2=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- models/ai_model_manage.go | 110 ++++++- models/models.go | 1 + options/locale/locale_en-US.ini | 3 + options/locale/locale_zh-CN.ini | 3 + routers/repo/ai_model_manage.go | 21 +- routers/routes/routes.go | 1 + templates/repo/modelmanage/convertIndex.tmpl | 285 +++++++++++++++++++ templates/repo/modelmanage/index.tmpl | 7 +- 8 files changed, 421 insertions(+), 10 deletions(-) create mode 100644 templates/repo/modelmanage/convertIndex.tmpl diff --git a/models/ai_model_manage.go b/models/ai_model_manage.go index ed696fcf0..ac4aed302 100644 --- a/models/ai_model_manage.go +++ b/models/ai_model_manage.go @@ -39,6 +39,29 @@ type AiModelManage struct { IsCanDelete bool } +type AiModelManageConvert struct { + ID string `xorm:"pk"` + Name string `xorm:"INDEX NOT NULL"` + Status int `xorm:"NOT NULL DEFAULT 0"` + SrcEngine int `xorm:"NOT NULL DEFAULT 0"` + RepoId int64 `xorm:"INDEX NULL"` + ModelId string `xorm:"NOT NULL"` + ModelVersion string `xorm:"NOT NULL"` + DestFormat int `xorm:"NOT NULL DEFAULT 0"` + NetOutputFormat int `xorm:"NULL"` + UserId int64 `xorm:"NOT NULL"` + RunTime int64 `xorm:"NULL"` + InputShape string `xorm:"varchar(2000)"` + InputDataFormat string `xorm:"NOT NULL"` + Description string `xorm:"varchar(2000)"` + CreatedUnix timeutil.TimeStamp `xorm:"created"` + UpdatedUnix timeutil.TimeStamp `xorm:"updated"` + UserName string + UserRelAvatarLink string + IsCanOper bool + IsCanDelete bool +} + type AiModelQueryOptions struct { ListOptions RepoID int64 // include all repos if empty @@ -47,7 +70,20 @@ type AiModelQueryOptions struct { SortType string New int // JobStatus CloudbrainStatus - Type int + Type int + Status int +} + +func SaveModelConvert(modelConvert *AiModelManageConvert) error { + sess := x.NewSession() + defer sess.Close() + re, err := sess.Insert(modelConvert) + if err != nil { + log.Info("insert modelConvert error." + err.Error()) + return err + } + log.Info("success to save modelConvert db.re=" + fmt.Sprint((re))) + return nil } func SaveModelToDb(model *AiModelManage) error { @@ -63,6 +99,20 @@ func SaveModelToDb(model *AiModelManage) error { return nil } +func QueryModelConvertById(id string) (*AiModelManageConvert, error) { + sess := x.NewSession() + defer sess.Close() + sess.Select("*").Table(new(AiModelManageConvert)).Where("id='" + id + "'") + aiModelManageConvertList := make([]*AiModelManageConvert, 0) + err := sess.Find(&aiModelManageConvertList) + if err == nil { + if len(aiModelManageConvertList) == 1 { + return aiModelManageConvertList[0], nil + } + } + return nil, err +} + func QueryModelById(id string) (*AiModelManage, error) { sess := x.NewSession() defer sess.Close() @@ -78,10 +128,22 @@ func QueryModelById(id string) (*AiModelManage, error) { return nil, err } -func DeleteModelById(id string) error { +func DeleteModelConvertById(id string) error { sess := x.NewSession() defer sess.Close() + re, err := sess.Delete(&AiModelManageConvert{ + ID: id, + }) + if err != nil { + return err + } + log.Info("success to delete AiModelManageConvert from db.re=" + fmt.Sprint((re))) + return nil +} +func DeleteModelById(id string) error { + sess := x.NewSession() + defer sess.Close() re, err := sess.Delete(&AiModelManage{ ID: id, }) @@ -90,7 +152,6 @@ func DeleteModelById(id string) error { } log.Info("success to delete from db.re=" + fmt.Sprint((re))) return nil - } func ModifyModelDescription(id string, description string) error { @@ -201,3 +262,46 @@ func QueryModel(opts *AiModelQueryOptions) ([]*AiModelManage, int64, error) { return aiModelManages, count, nil } + +func QueryModelConvert(opts *AiModelQueryOptions) ([]*AiModelManageConvert, int64, error) { + sess := x.NewSession() + defer sess.Close() + var cond = builder.NewCond() + if opts.RepoID > 0 { + cond = cond.And( + builder.Eq{"ai_model_manage_convert.repo_id": opts.RepoID}, + ) + } + if opts.UserID > 0 { + cond = cond.And( + builder.Eq{"ai_model_manage_convert.user_id": opts.UserID}, + ) + } + if (opts.Status) >= 0 { + cond = cond.And( + builder.Eq{"ai_model_manage_convert.status": opts.Status}, + ) + } + count, err := sess.Where(cond).Count(new(AiModelManageConvert)) + if err != nil { + return nil, 0, fmt.Errorf("Count: %v", err) + } + + if opts.Page >= 0 && opts.PageSize > 0 { + var start int + if opts.Page == 0 { + start = 0 + } else { + start = (opts.Page - 1) * opts.PageSize + } + sess.Limit(opts.PageSize, start) + } + sess.OrderBy("ai_model_manage_convert.created_unix DESC") + aiModelManageConvert := make([]*AiModelManageConvert, 0, setting.UI.IssuePagingNum) + if err := sess.Table(new(AiModelManageConvert)).Where(cond). + Find(&aiModelManageConvert); err != nil { + return nil, 0, fmt.Errorf("Find: %v", err) + } + + return aiModelManageConvert, count, nil +} diff --git a/models/models.go b/models/models.go index 2a2e119fb..962cb3ce9 100755 --- a/models/models.go +++ b/models/models.go @@ -144,6 +144,7 @@ func init() { new(WechatBindLog), new(OrgStatistic), new(SearchRecord), + new(AiModelManageConvert), ) tablesStatistic = append(tablesStatistic, diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 735525efb..7bc41e910 100755 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -1145,6 +1145,9 @@ model.manage.Recall = Recall model.manage.sava_model = Sava Model model.manage.model_manage = ModelManage model.manage.model_accuracy = Model Accuracy +model.convert=Model Transformation +model.list=Model List +model.manage.create_new_convert_task=Create Model Transformation Task template.items = Template Items template.git_content = Git Content (Default Branch) diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index 483ddde6c..260c24e49 100755 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -1156,6 +1156,9 @@ model.manage.Recall = 召回率 model.manage.sava_model = 保存模型 model.manage.model_manage = 模型管理 model.manage.model_accuracy = 模型精度 +model.convert=模型转换任务 +model.list=模型列表 +model.manage.create_new_convert_task=创建模型转换任务 template.items=模板选项 template.git_content=Git数据(默认分支) diff --git a/routers/repo/ai_model_manage.go b/routers/repo/ai_model_manage.go index a13095d52..4db546180 100644 --- a/routers/repo/ai_model_manage.go +++ b/routers/repo/ai_model_manage.go @@ -20,12 +20,13 @@ import ( ) const ( - Model_prefix = "aimodels/" - tplModelManageIndex = "repo/modelmanage/index" - tplModelManageDownload = "repo/modelmanage/download" - tplModelInfo = "repo/modelmanage/showinfo" - MODEL_LATEST = 1 - MODEL_NOT_LATEST = 0 + Model_prefix = "aimodels/" + tplModelManageIndex = "repo/modelmanage/index" + tplModelManageConvertIndex = "repo/modelmanage/convertIndex" + tplModelManageDownload = "repo/modelmanage/download" + tplModelInfo = "repo/modelmanage/showinfo" + MODEL_LATEST = 1 + MODEL_NOT_LATEST = 0 ) func saveModelByParameters(jobId string, versionName string, name string, version string, label string, description string, ctx *context.Context) error { @@ -617,6 +618,14 @@ func ShowModelTemplate(ctx *context.Context) { ctx.HTML(200, tplModelManageIndex) } +func ConvertModelTemplate(ctx *context.Context) { + ctx.Data["isModelManage"] = true + ctx.Data["MODEL_COUNT"] = 0 + ctx.Data["ModelManageAccess"] = ctx.Repo.CanWrite(models.UnitTypeModelManage) + ctx.Data["TRAIN_COUNT"] = 0 + ctx.HTML(200, tplModelManageConvertIndex) +} + func isQueryRight(ctx *context.Context) bool { if ctx.Repo.Repository.IsPrivate { if ctx.Repo.CanRead(models.UnitTypeModelManage) || ctx.User.IsAdmin || ctx.Repo.IsAdmin() || ctx.Repo.IsOwner() { diff --git a/routers/routes/routes.go b/routers/routes/routes.go index 1e1a862ff..12447b96b 100755 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -1081,6 +1081,7 @@ func RegisterRoutes(m *macaron.Macaron) { m.Delete("/delete_model", repo.DeleteModel) m.Put("/modify_model", repo.ModifyModelInfo) m.Get("/show_model", reqRepoModelManageReader, repo.ShowModelTemplate) + m.Get("/convert_model", reqRepoModelManageReader, repo.ConvertModelTemplate) m.Get("/show_model_info", repo.ShowModelInfo) m.Get("/show_model_info_api", repo.ShowSingleModel) m.Get("/show_model_api", repo.ShowModelPageInfo) diff --git a/templates/repo/modelmanage/convertIndex.tmpl b/templates/repo/modelmanage/convertIndex.tmpl new file mode 100644 index 000000000..4230cfd05 --- /dev/null +++ b/templates/repo/modelmanage/convertIndex.tmpl @@ -0,0 +1,285 @@ + +{{template "base/head" .}} + +
+
+
+
+
+
+
+
+
+{{$repository := .Repository.ID}} + +
+ +
+ {{template "repo/header" .}} + +
+ {{template "base/alert" .}} + + + + +
+ +
+ + + + + + + +
+ +
+
+ + + +{{template "base/footer" .}} + + + diff --git a/templates/repo/modelmanage/index.tmpl b/templates/repo/modelmanage/index.tmpl index e65fbf004..5f3936ff6 100644 --- a/templates/repo/modelmanage/index.tmpl +++ b/templates/repo/modelmanage/index.tmpl @@ -20,7 +20,12 @@
{{template "base/alert" .}}
-
+
{{$.i18n.Tr "repo.model.manage.import_new_model"}} From 1a7eb69d939dd6999bdee04024f405cb4cfe4318 Mon Sep 17 00:00:00 2001 From: zouap Date: Tue, 31 May 2022 16:17:48 +0800 Subject: [PATCH 016/424] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2=E4=BB=BB=E5=8A=A1=E7=95=8C=E9=9D=A2=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- templates/repo/modelmanage/convertIndex.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/repo/modelmanage/convertIndex.tmpl b/templates/repo/modelmanage/convertIndex.tmpl index 4230cfd05..b72feb9db 100644 --- a/templates/repo/modelmanage/convertIndex.tmpl +++ b/templates/repo/modelmanage/convertIndex.tmpl @@ -37,7 +37,7 @@
-
+
From 7ca7d93905ba62a96e3a649db9e2139cab82934b Mon Sep 17 00:00:00 2001 From: zouap Date: Tue, 31 May 2022 16:35:38 +0800 Subject: [PATCH 017/424] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2=E4=BB=BB=E5=8A=A1=E7=95=8C=E9=9D=A2=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- templates/repo/modelmanage/convertIndex.tmpl | 54 ++++++++++---------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/templates/repo/modelmanage/convertIndex.tmpl b/templates/repo/modelmanage/convertIndex.tmpl index b72feb9db..e9b7e2016 100644 --- a/templates/repo/modelmanage/convertIndex.tmpl +++ b/templates/repo/modelmanage/convertIndex.tmpl @@ -33,12 +33,12 @@
- - {{end}} +
@@ -526,7 +595,7 @@ filename = filename || '' init = init || '' console.log("start") - $.get(`/api/v1/repos/${userName}/${repoPath}/cloudbrain/inference-job/${jobID}/model_list?version_name=${version_name}&parentDir=${parents}`, (data) => { + $.get(`/api/v1/repos/${userName}/${repoPath}/cloudbrain/inference-job/${jobID}/result_list?version_name=${version_name}&parentDir=${parents}`, (data) => { $(`#dir_list${version_name}`).empty() renderDir(data, version_name) if (init === "init") { From 7f41f3d8a7193b7c76a5365ef54c2422cc2dbbd2 Mon Sep 17 00:00:00 2001 From: ychao_1983 Date: Fri, 8 Jul 2022 17:35:53 +0800 Subject: [PATCH 335/424] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/cloudbrain/cloudbrain.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/cloudbrain/cloudbrain.go b/modules/cloudbrain/cloudbrain.go index 2ce2cf885..08e39452c 100755 --- a/modules/cloudbrain/cloudbrain.go +++ b/modules/cloudbrain/cloudbrain.go @@ -256,7 +256,13 @@ func GenerateTask(req GenerateCloudBrainTaskReq) error { ReadOnly: false, }, }, - + { + HostPath: models.StHostPath{ + Path: req.ModelPath, + MountPath: ModelMountPath, + ReadOnly: false, + }, + }, { HostPath: models.StHostPath{ Path: req.BenchmarkPath, From 8f3f5bd392e500663f8503745ba9995b206a8b4c Mon Sep 17 00:00:00 2001 From: zhoupzh Date: Fri, 8 Jul 2022 17:37:34 +0800 Subject: [PATCH 336/424] fix issue --- templates/repo/cloudbrain/inference/show.tmpl | 6 +- templates/repo/cloudbrain/trainjob/show.tmpl | 735 ++++++++++++++++++ 2 files changed, 738 insertions(+), 3 deletions(-) create mode 100644 templates/repo/cloudbrain/trainjob/show.tmpl diff --git a/templates/repo/cloudbrain/inference/show.tmpl b/templates/repo/cloudbrain/inference/show.tmpl index 45d38c2eb..6bf003db4 100644 --- a/templates/repo/cloudbrain/inference/show.tmpl +++ b/templates/repo/cloudbrain/inference/show.tmpl @@ -308,11 +308,11 @@ - {{$.i18n.Tr "repo.modelarts.train_job.AI_driver"}} + {{$.i18n.Tr "repo.modelarts.train_job.resource_type"}}
- {{.EngineName}} + {{$.resource_type}}
@@ -456,7 +456,7 @@
- {{.FlavorName}} + {{$.i18n.Tr "cloudbrain.gpu_num"}}:{{$.GpuNum}},{{$.i18n.Tr "cloudbrain.cpu_num"}}:{{$.CpuNum}},{{$.i18n.Tr "cloudbrain.memory"}}(MB):{{$.MemMiB}},{{$.i18n.Tr "cloudbrain.shared_memory"}}(MB):{{$.ShareMemMiB}}
diff --git a/templates/repo/cloudbrain/trainjob/show.tmpl b/templates/repo/cloudbrain/trainjob/show.tmpl new file mode 100644 index 000000000..05d678016 --- /dev/null +++ b/templates/repo/cloudbrain/trainjob/show.tmpl @@ -0,0 +1,735 @@ +{{template "base/head" .}} + +
+
+
+
+
+
+
+
+
+
+ {{template "repo/header" .}} +
+

+ +

+ {{range $k ,$v := .version_list_task}} +
+ +
+
+
+ + + +
+ {{TimeSinceUnix1 .CreatedUnix}} + + {{$.i18n.Tr "repo.modelarts.status"}}: + {{.Status}} + + {{$.i18n.Tr "repo.modelarts.train_job.dura_time"}}: + {{$.duration}} + +
+
+
+
+
+
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {{$.i18n.Tr "repo.cloudbrain_task"}} + +
+ {{.DisplayJobName}} +
+
+ {{$.i18n.Tr "repo.modelarts.status"}} + +
+ {{.Status}} +
+
+ {{$.i18n.Tr "repo.modelarts.train_job.start_time"}} + +
+ {{TimeSinceUnix1 .CreatedUnix}} +
+
+ {{$.i18n.Tr "repo.modelarts.train_job.dura_time"}} + +
+ {{$.duration}} +
+
+ {{$.i18n.Tr "repo.modelarts.train_job.resource_type"}} + +
+ {{$.resource_type}} +
+
+ {{$.i18n.Tr "repo.modelarts.train_job.standard"}} + +
+ {{$.i18n.Tr "cloudbrain.gpu_num"}}:{{$.GpuNum}},{{$.i18n.Tr "cloudbrain.cpu_num"}}:{{$.CpuNum}},{{$.i18n.Tr "cloudbrain.memory"}}(MB):{{$.MemMiB}},{{$.i18n.Tr "cloudbrain.shared_memory"}}(MB):{{$.ShareMemMiB}} +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {{$.i18n.Tr "cloudbrain.mirror"}} + +
+ {{.Image}} +
+
+ {{$.i18n.Tr "repo.modelarts.code_version"}} + +
+ {{.BranchName}} +
+
+ {{$.i18n.Tr "repo.modelarts.train_job.start_file"}} + +
+ {{.BootFile}} +
+
+ {{$.i18n.Tr "repo.modelarts.train_job.train_dataset"}} + +
+ {{.DatasetName}} +
+
+ {{$.i18n.Tr "repo.modelarts.train_job.run_parameter"}} + +
+ {{.Parameters}} +
+
+ {{$.i18n.Tr "repo.modelarts.train_job.description"}} + +
+ {{.Description}} +
+
+
+
+
+ +
+
+ +
+
+ +
+ + + + + +
+ +
+ +
+ +
+
+ +
+ + +

+                            
+ +
+ +
+ +
+ + + +
+ +
+
+ + {{$.i18n.Tr "repo.file_limit_100"}} +
+
+ +
+
+
+ {{end}} {{template "base/paginate" .}} +
+ +
+ +
+ + +
+{{template "base/footer" .}} + + \ No newline at end of file From e7f20926a87229fab7dfb08348230badd6ae8294 Mon Sep 17 00:00:00 2001 From: zhoupzh Date: Fri, 8 Jul 2022 17:56:30 +0800 Subject: [PATCH 337/424] fix issue --- templates/repo/cloudbrain/inference/show.tmpl | 32 ++----------------- 1 file changed, 2 insertions(+), 30 deletions(-) diff --git a/templates/repo/cloudbrain/inference/show.tmpl b/templates/repo/cloudbrain/inference/show.tmpl index 6bf003db4..f79682589 100644 --- a/templates/repo/cloudbrain/inference/show.tmpl +++ b/templates/repo/cloudbrain/inference/show.tmpl @@ -233,8 +233,7 @@ data-tab="first">{{$.i18n.Tr "repo.modelarts.train_job.config"}} {{$.i18n.Tr "repo.cloudbrain.runinfo"}} - {{$.i18n.Tr "repo.modelarts.log"}} + {{$.i18n.Tr "repo.model_download"}}
@@ -487,21 +486,7 @@
-
-
- -
- - -

-                    
- -
- -
+
@@ -577,19 +562,6 @@ e.cancelBubble = true; //ie兼容 } } - - 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) => { - $('input[name=end_line]').val(data.EndLine) - $('input[name=start_line]').val(data.StartLine) - $(`#log_file${version_name}`).text(data.Content) - document.getElementById("mask").style.display = "none" - }).fail(function (err) { - console.log(err); - document.getElementById("mask").style.display = "none" - }); - } function loadModelFile(version_name, parents, filename, init) { parents = parents || '' filename = filename || '' From e4c9094a6dd6c2e2e5d504311830c731ef6d0941 Mon Sep 17 00:00:00 2001 From: ychao_1983 Date: Mon, 11 Jul 2022 09:08:26 +0800 Subject: [PATCH 338/424] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- routers/repo/cloudbrain.go | 41 +------------------------------------- routers/repo/modelarts.go | 2 +- 2 files changed, 2 insertions(+), 41 deletions(-) diff --git a/routers/repo/cloudbrain.go b/routers/repo/cloudbrain.go index 335befcfa..68f2bc686 100755 --- a/routers/repo/cloudbrain.go +++ b/routers/repo/cloudbrain.go @@ -99,45 +99,6 @@ func cloudBrainNewDataPrepare(ctx *context.Context) error { var displayJobName = jobNamePrefixValid(cutString(ctx.User.Name, 5)) + t.Format("2006010215") + strconv.Itoa(int(t.Unix()))[5:] ctx.Data["display_job_name"] = displayJobName - result, err := cloudbrain.GetImages() - if err != nil { - ctx.Data["error"] = err.Error() - log.Error("cloudbrain.GetImages failed:", err.Error(), ctx.Data["MsgID"]) - } - - for i, payload := range result.Payload.ImageInfo { - if strings.HasPrefix(result.Payload.ImageInfo[i].Place, "192.168") { - result.Payload.ImageInfo[i].PlaceView = payload.Place[strings.Index(payload.Place, "/"):len(payload.Place)] - } else { - result.Payload.ImageInfo[i].PlaceView = payload.Place - } - } - - ctx.Data["images"] = result.Payload.ImageInfo - - resultPublic, err := cloudbrain.GetPublicImages() - if err != nil { - ctx.Data["error"] = err.Error() - log.Error("cloudbrain.GetPublicImages failed:", err.Error(), ctx.Data["MsgID"]) - } - - for i, payload := range resultPublic.Payload.ImageInfo { - if strings.HasPrefix(resultPublic.Payload.ImageInfo[i].Place, "192.168") { - resultPublic.Payload.ImageInfo[i].PlaceView = payload.Place[strings.Index(payload.Place, "/"):len(payload.Place)] - } else { - resultPublic.Payload.ImageInfo[i].PlaceView = payload.Place - } - } - - ctx.Data["public_images"] = resultPublic.Payload.ImageInfo - - attachs, err := models.GetAllUserAttachments(ctx.User.ID) - if err != nil { - log.Error("GetAllUserAttachments failed: %v", err, ctx.Data["MsgID"]) - return err - } - - ctx.Data["attachments"] = attachs ctx.Data["command"] = cloudbrain.Command ctx.Data["code_path"] = cloudbrain.CodeMountPath ctx.Data["dataset_path"] = cloudbrain.DataSetMountPath @@ -353,7 +314,7 @@ func CloudBrainInferenceJobCreate(ctx *context.Context, form auth.CreateCloudBra branchName := form.BranchName repo := ctx.Repo.Repository - ckptUrl := setting.Attachment.Minio.RealPath + setting.Attachment.Minio.Bucket + "/" + form.TrainUrl + form.CkptName + ckptUrl := setting.Attachment.Minio.RealPath + "/" + form.TrainUrl + form.CkptName log.Info("ckpt url:" + ckptUrl) tpl := tplCloudBrainInferenceJobNew command, err := getInferenceJobCommand(form) diff --git a/routers/repo/modelarts.go b/routers/repo/modelarts.go index 1354bcae1..780f0db51 100755 --- a/routers/repo/modelarts.go +++ b/routers/repo/modelarts.go @@ -1881,7 +1881,7 @@ func InferenceJobCreate(ctx *context.Context, form auth.CreateModelArtsInference modelName := form.ModelName modelVersion := form.ModelVersion ckptName := form.CkptName - ckptUrl := "/" + setting.Bucket + "/" + form.TrainUrl + form.CkptName + ckptUrl := "/" + form.TrainUrl + form.CkptName log.Info("ckpt url:" + ckptUrl) count, err := models.GetCloudbrainInferenceJobCountByUserID(ctx.User.ID) From 63c5681bb4b449a543733ae7e2cd89f98eb410ad Mon Sep 17 00:00:00 2001 From: zhoupzh Date: Mon, 11 Jul 2022 09:50:55 +0800 Subject: [PATCH 339/424] fix issue --- templates/repo/cloudbrain/inference/show.tmpl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/templates/repo/cloudbrain/inference/show.tmpl b/templates/repo/cloudbrain/inference/show.tmpl index f79682589..a39fe9198 100644 --- a/templates/repo/cloudbrain/inference/show.tmpl +++ b/templates/repo/cloudbrain/inference/show.tmpl @@ -219,8 +219,8 @@ {{.i18n.Tr "repo.cloudbrain"}}
/
- - {{$.i18n.Tr "repo.modelarts.train_job"}} + + {{$.i18n.Tr "repo.modelarts.infer_job"}}
/
{{.displayJobName}}
@@ -633,7 +633,7 @@ html += "" + data.Dirs[i].FileName + "" } else { if (downlaodFlag) { - html += `` + html += `` } else { html += `` From 72174f54545299430a94b03416b3a6a8ef5b1071 Mon Sep 17 00:00:00 2001 From: ychao_1983 Date: Mon, 11 Jul 2022 09:52:16 +0800 Subject: [PATCH 340/424] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- routers/repo/cloudbrain.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routers/repo/cloudbrain.go b/routers/repo/cloudbrain.go index 68f2bc686..531c04658 100755 --- a/routers/repo/cloudbrain.go +++ b/routers/repo/cloudbrain.go @@ -314,7 +314,7 @@ func CloudBrainInferenceJobCreate(ctx *context.Context, form auth.CreateCloudBra branchName := form.BranchName repo := ctx.Repo.Repository - ckptUrl := setting.Attachment.Minio.RealPath + "/" + form.TrainUrl + form.CkptName + ckptUrl := setting.Attachment.Minio.RealPath + form.TrainUrl + form.CkptName log.Info("ckpt url:" + ckptUrl) tpl := tplCloudBrainInferenceJobNew command, err := getInferenceJobCommand(form) @@ -390,7 +390,7 @@ func CloudBrainInferenceJobCreate(ctx *context.Context, form auth.CreateCloudBra DatasetNames: datasetNames, DatasetInfos: datasetInfos, CodePath: storage.GetMinioPath(jobName, cloudbrain.CodeMountPath+"/"), - ModelPath: setting.Attachment.Minio.RealPath + setting.Attachment.Minio.Bucket + "/" + form.TrainUrl, + ModelPath: setting.Attachment.Minio.RealPath + form.TrainUrl, BenchmarkPath: storage.GetMinioPath(jobName, cloudbrain.BenchMarkMountPath+"/"), Snn4ImageNetPath: storage.GetMinioPath(jobName, cloudbrain.Snn4imagenetMountPath+"/"), BrainScorePath: storage.GetMinioPath(jobName, cloudbrain.BrainScoreMountPath+"/"), From 9061efccedd1d3b51174fdcf9973358214aced6e Mon Sep 17 00:00:00 2001 From: ychao_1983 Date: Mon, 11 Jul 2022 10:19:02 +0800 Subject: [PATCH 341/424] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- routers/repo/cloudbrain.go | 54 +------------------------------------- 1 file changed, 1 insertion(+), 53 deletions(-) diff --git a/routers/repo/cloudbrain.go b/routers/repo/cloudbrain.go index 531c04658..0b3613bee 100755 --- a/routers/repo/cloudbrain.go +++ b/routers/repo/cloudbrain.go @@ -2384,59 +2384,7 @@ func InferenceCloudBrainJobNew(ctx *context.Context) { } func InferenceCloudBrainJobShow(ctx *context.Context) { - err := cloudBrainNewDataPrepare(ctx) - if err != nil { - ctx.ServerError("get new train-job info failed", err) - return - } - - var jobID = ctx.Params(":jobid") - - task, err := models.GetCloudbrainByJobID(jobID) - - if err != nil { - log.Error("GetInferenceTask(%s) failed:%v", jobID, err.Error()) - ctx.RenderWithErr(err.Error(), tplCloudBrainInferenceJobShow, nil) - return - } - - //将运行参数转化为epoch_size = 3, device_target = Ascend的格式 - var parameters models.Parameters - err = json.Unmarshal([]byte(task.Parameters), ¶meters) - if err != nil { - log.Error("Failed to Unmarshal Parameters: %s (%v)", task.Parameters, err) - ctx.RenderWithErr(err.Error(), tplCloudBrainInferenceJobShow, nil) - return - } - - if len(parameters.Parameter) > 0 { - paramTemp := "" - for _, Parameter := range parameters.Parameter { - param := Parameter.Label + " = " + Parameter.Value + "; " - paramTemp = paramTemp + param - } - task.Parameters = paramTemp[:len(paramTemp)-2] - } else { - task.Parameters = "" - } - - LabelName := strings.Fields(task.LabelName) - ctx.Data["labelName"] = LabelName - ctx.Data["jobID"] = jobID - ctx.Data["jobName"] = task.JobName - ctx.Data["displayJobName"] = task.DisplayJobName - ctx.Data["task"] = task - ctx.Data["canDownload"] = cloudbrain.CanModifyJob(ctx, task) - - tempUids := []int64{} - tempUids = append(tempUids, task.UserID) - JobCreater, err := models.GetUserNamesByIDs(tempUids) - if err != nil { - log.Error("GetUserNamesByIDs (WhitelistUserIDs): %v", err) - } - ctx.Data["userName"] = JobCreater[0] - - ctx.HTML(http.StatusOK, tplCloudBrainInferenceJobShow) + cloudBrainShow(ctx, tplCloudBrainInferenceJobShow, models.JobTypeTrain) } func DownloadInferenceResultFile(ctx *context.Context) { From 4a870b2e32114c1d8505cd856cf6e2f5623f7fdc Mon Sep 17 00:00:00 2001 From: zhoupzh Date: Mon, 11 Jul 2022 10:34:23 +0800 Subject: [PATCH 342/424] fix issue --- templates/repo/modelarts/inferencejob/show.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/repo/modelarts/inferencejob/show.tmpl b/templates/repo/modelarts/inferencejob/show.tmpl index 5c912d575..b5aadca95 100644 --- a/templates/repo/modelarts/inferencejob/show.tmpl +++ b/templates/repo/modelarts/inferencejob/show.tmpl @@ -420,7 +420,7 @@ td, th {
{{$.i18n.Tr "repo.modelarts.download_log"}} From a2c3e330277864e9ddfb35489fa30229bb4fc122 Mon Sep 17 00:00:00 2001 From: ychao_1983 Date: Mon, 11 Jul 2022 12:37:55 +0800 Subject: [PATCH 343/424] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- models/cloudbrain.go | 21 ++++++++++++++++++- modules/cloudbrain/resty.go | 41 ++++++++++++++++++++++++++++--------- routers/repo/cloudbrain.go | 13 ++++-------- 3 files changed, 55 insertions(+), 20 deletions(-) diff --git a/models/cloudbrain.go b/models/cloudbrain.go index 600c8ffc4..b866e4c1a 100755 --- a/models/cloudbrain.go +++ b/models/cloudbrain.go @@ -306,6 +306,22 @@ type CreateJobResult struct { Payload map[string]interface{} `json:"payload"` } +type QueueDetailResult struct { + Code string `json:"code"` + Msg string `json:"msg"` + Payload map[string]QueueDetail `json:"payload"` +} + +type QueueDetail struct { + JobScheduleInfo JobScheduleInfo `json:"JobScheduleInfo"` +} + +type JobScheduleInfo struct { + Pending int `json:"Pending"` + Running int `json:"Running"` + MedianPendingJobDurationSec int `json:"MedianPendingJobDurationSec"` +} + type GetJobResult struct { Code string `json:"code"` Msg string `json:"msg"` @@ -1743,7 +1759,10 @@ func GetBenchmarkCountByUserID(userID int64) (int, error) { } func GetWaitingCloudbrainCount(cloudbrainType int, computeResource string, jobTypes ...JobType) (int64, error) { - sess := x.In("JobType", jobTypes).And("status=? and type=?", JobWaiting, cloudbrainType) + sess := x.Where("status=? and type=?", JobWaiting, cloudbrainType) + if len(jobTypes) >= 0 { + sess.In("JobType", jobTypes) + } if computeResource != "" { sess.And("compute_resource=?", computeResource) } diff --git a/modules/cloudbrain/resty.go b/modules/cloudbrain/resty.go index de8d3779c..7b714c4b5 100755 --- a/modules/cloudbrain/resty.go +++ b/modules/cloudbrain/resty.go @@ -30,6 +30,7 @@ const ( LogPageSize = 500 LogPageTokenExpired = "5m" pageSize = 15 + QueuesDetailUrl = "/rest-server/api/v2/queuesdetail" ) func getRestyClient() *resty.Client { @@ -73,6 +74,36 @@ func loginCloudbrain() error { return nil } +func GetQueuesDetail() (*map[string]int, error) { + checkSetting() + client := getRestyClient() + var jobResult models.QueueDetailResult + + var result = make(map[string]int, 0) + + res, err := client.R(). + SetHeader("Content-Type", "application/json"). + SetAuthToken(TOKEN). + SetResult(&jobResult). + Get(HOST + QueuesDetailUrl) + + if err != nil { + return nil, fmt.Errorf("resty get queues detail failed: %s", err) + } + + if jobResult.Code != Success { + return nil, fmt.Errorf("jobResult err: %s", res.String()) + } + + for k, v := range jobResult.Payload { + + result[k] = v.JobScheduleInfo.Pending + + } + return &result, nil + +} + func CreateJob(jobName string, createJobParams models.CreateJobParams) (*models.CreateJobResult, error) { checkSetting() client := getRestyClient() @@ -145,16 +176,6 @@ sendjob: return &getJobResult, nil } -func GetImages() (*models.GetImagesResult, error) { - - return GetImagesPageable(1, 100, Custom, "") - -} - -func GetPublicImages() (*models.GetImagesResult, error) { - return GetImagesPageable(1, 100, Public, "") -} - func GetImagesPageable(page int, size int, imageType string, name string) (*models.GetImagesResult, error) { checkSetting() client := getRestyClient() diff --git a/routers/repo/cloudbrain.go b/routers/repo/cloudbrain.go index 0b3613bee..1573df3c8 100755 --- a/routers/repo/cloudbrain.go +++ b/routers/repo/cloudbrain.go @@ -112,7 +112,10 @@ func cloudBrainNewDataPrepare(ctx *context.Context) error { ctx.Data["benchmark_categories"] = categories.Category ctx.Data["benchmark_types"] = GetBenchmarkTypes(ctx).BenchmarkType - + queuesDetail, _ := cloudbrain.GetQueuesDetail() + if queuesDetail != nil { + ctx.Data["QueuesDetail"] = queuesDetail + } if gpuInfos == nil { json.Unmarshal([]byte(setting.GpuTypes), &gpuInfos) } @@ -164,8 +167,6 @@ func CloudBrainNew(ctx *context.Context) { ctx.ServerError("get new cloudbrain info failed", err) return } - waitCount := cloudbrain.GetWaitingCloudbrainCount(models.TypeCloudBrainOne, "", models.JobTypeDebug) - ctx.Data["WaitCount"] = waitCount ctx.HTML(200, tplCloudBrainNew) } @@ -1922,8 +1923,6 @@ func CloudBrainBenchmarkNew(ctx *context.Context) { ctx.ServerError("get new cloudbrain info failed", err) return } - waitCount := cloudbrain.GetWaitingCloudbrainCount(models.TypeCloudBrainOne, "", models.JobTypeBrainScore, models.JobTypeSnn4imagenet, models.JobTypeBenchmark) - ctx.Data["WaitCount"] = waitCount ctx.HTML(200, tplCloudBrainBenchmarkNew) } @@ -2367,8 +2366,6 @@ func CloudBrainTrainJobNew(ctx *context.Context) { ctx.ServerError("get new train-job info failed", err) return } - waitCount := cloudbrain.GetWaitingCloudbrainCount(models.TypeCloudBrainOne, "", models.JobTypeTrain) - ctx.Data["WaitCount"] = waitCount ctx.HTML(http.StatusOK, tplCloudBrainTrainJobNew) } @@ -2378,8 +2375,6 @@ func InferenceCloudBrainJobNew(ctx *context.Context) { ctx.ServerError("get new train-job info failed", err) return } - waitCount := cloudbrain.GetWaitingCloudbrainCount(models.TypeCloudBrainOne, "", models.JobTypeInference) - ctx.Data["WaitCount"] = waitCount ctx.HTML(http.StatusOK, tplCloudBrainInferenceJobNew) } From b52803f1812ded5ebaf9aba68c1e47283ca5f79f Mon Sep 17 00:00:00 2001 From: zhoupzh Date: Mon, 11 Jul 2022 15:51:46 +0800 Subject: [PATCH 344/424] fix issue --- templates/repo/cloudbrain/inference/show.tmpl | 119 +------ templates/repo/cloudbrain/trainjob/show.tmpl | 119 +------ templates/repo/grampus/trainjob/show.tmpl | 254 +------------- .../repo/modelarts/inferencejob/show.tmpl | 241 +------------- templates/repo/modelarts/trainjob/show.tmpl | 257 +-------------- web_src/js/features/cloudbrainShow.js | 309 ++++++++++++++++++ web_src/js/index.js | 140 ++++---- 7 files changed, 389 insertions(+), 1050 deletions(-) create mode 100644 web_src/js/features/cloudbrainShow.js diff --git a/templates/repo/cloudbrain/inference/show.tmpl b/templates/repo/cloudbrain/inference/show.tmpl index a39fe9198..b02c9694b 100644 --- a/templates/repo/cloudbrain/inference/show.tmpl +++ b/templates/repo/cloudbrain/inference/show.tmpl @@ -234,8 +234,8 @@ {{$.i18n.Tr "repo.cloudbrain.runinfo"}} - {{$.i18n.Tr "repo.model_download"}} + {{$.i18n.Tr "repo.model_download"}}
@@ -562,122 +562,7 @@ e.cancelBubble = true; //ie兼容 } } - function loadModelFile(version_name, parents, filename, init) { - parents = parents || '' - filename = filename || '' - init = init || '' - console.log("start") - $.get(`/api/v1/repos/${userName}/${repoPath}/cloudbrain/inference-job/${jobID}/result_list?version_name=${version_name}&parentDir=${parents}`, (data) => { - $(`#dir_list${version_name}`).empty() - renderDir(data, version_name) - if (init === "init") { - $(`input[name=model${version_name}]`).val("") - $(`input[name=modelback${version_name}]`).val(version_name) - $(`#file_breadcrumb${version_name}`).empty() - let htmlBread = "" - htmlBread += `
${version_name}
` - htmlBread += "
/
" - $(`#file_breadcrumb${version_name}`).append(htmlBread) - } else { - renderBrend(version_name, parents, filename, init) - } - }).fail(function (err) { - console.log(err, version_name); - }); - - } - function renderBrend(version_name, parents, filename, init) { - if (init == "folder") { - let htmlBrend = "" - let sectionName = $(`#file_breadcrumb${version_name} .active.section`).text() - let parents1 = $(`input[name=model${version_name}]`).val() - let filename1 = $(`input[name=modelback${version_name}]`).val() - if (parents1 === "") { - $(`#file_breadcrumb${version_name} .active.section`).replaceWith(`${sectionName}`) - } else { - $(`#file_breadcrumb${version_name} .active.section`).replaceWith(`${sectionName}`) - } - - htmlBrend += `
${filename}
` - htmlBrend += "
/
" - $(`#file_breadcrumb${version_name}`).append(htmlBrend) - $(`input[name=model${version_name}]`).val(parents) - $(`input[name=modelback${version_name}]`).val(filename) - } else { - $(`input[name=model${version_name}]`).val(parents) - $(`input[name=modelback${version_name}]`).val(filename) - $(`#file_breadcrumb${version_name} a.section:contains(${filename})`).nextAll().remove() - $(`#file_breadcrumb${version_name} a.section:contains(${filename})`).replaceWith(`
${filename}
`) - $(`#file_breadcrumb${version_name} div.section:contains(${filename})`).append("
/
") - } - - } - function renderDir(data, version_name) { - let html = "" - html += "
" - html += "
" - html += "
" - html += "
" - html += "" - html += '' - // html += "" - for (let i = 0; i < data.Dirs.length; i++) { - let dirs_size = renderSize(data.Dirs[i].Size) - html += "" - html += "" - html += "" - - html += "" - html += "" - - } - html += "" - html += "
" - html += "" - html += "" - html += "" - if (data.Dirs[i].IsDir) { - html += `` - html += "" + data.Dirs[i].FileName + "" - } else { - if (downlaodFlag) { - html += `` - } - else { - html += `` - } - html += "" + data.Dirs[i].FileName + "" - } - html += '' - html += "" - html += "" - if (data.Dirs[i].IsDir) { - html += "" - } else { - html += "" + `${dirs_size}` + "" - } - html += "" - html += "" + data.Dirs[i].ModTime + "" - html += "
" - html += "
" - html += "
" - html += "
" - html += "
" - $(`#dir_list${version_name}`).append(html) - } - function renderSize(value) { - if (null == value || value == '') { - return "0 Bytes"; - } - var unitArr = new Array("Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"); - var index = 0; - var srcsize = parseFloat(value); - index = Math.floor(Math.log(srcsize) / Math.log(1024)); - var size = srcsize / Math.pow(1024, index); - size = size.toFixed(0);//保留的小数位数 - return size + unitArr[index]; - } function refreshStatus(version_name) { $.get(`/api/v1/repos/${userName}/${repoPath}/cloudbrain/${taskID}?version_name=${versionname}`, (data) => { diff --git a/templates/repo/cloudbrain/trainjob/show.tmpl b/templates/repo/cloudbrain/trainjob/show.tmpl index 05d678016..3f66de0a3 100644 --- a/templates/repo/cloudbrain/trainjob/show.tmpl +++ b/templates/repo/cloudbrain/trainjob/show.tmpl @@ -264,8 +264,7 @@ onclick="javascript:parseInfo()">{{$.i18n.Tr "repo.cloudbrain.runinfo"}} {{$.i18n.Tr "repo.modelarts.log"}} - {{$.i18n.Tr "repo.model_download"}} + {{$.i18n.Tr "repo.model_download"}}
@@ -554,122 +553,6 @@ document.getElementById("mask").style.display = "none" }); } - function loadModelFile(version_name, parents, filename, init) { - parents = parents || '' - filename = filename || '' - init = init || '' - console.log("start") - $.get(`/api/v1/repos/${userName}/${repoPath}/cloudbrain/train-job/${jobID}/model_list?version_name=${version_name}&parentDir=${parents}`, (data) => { - $(`#dir_list${version_name}`).empty() - renderDir(data, version_name) - if (init === "init") { - $(`input[name=model${version_name}]`).val("") - $(`input[name=modelback${version_name}]`).val(version_name) - $(`#file_breadcrumb${version_name}`).empty() - let htmlBread = "" - htmlBread += `
${version_name}
` - htmlBread += "
/
" - $(`#file_breadcrumb${version_name}`).append(htmlBread) - } else { - renderBrend(version_name, parents, filename, init) - } - }).fail(function (err) { - console.log(err, version_name); - }); - - } - function renderBrend(version_name, parents, filename, init) { - if (init == "folder") { - let htmlBrend = "" - let sectionName = $(`#file_breadcrumb${version_name} .active.section`).text() - let parents1 = $(`input[name=model${version_name}]`).val() - let filename1 = $(`input[name=modelback${version_name}]`).val() - if (parents1 === "") { - $(`#file_breadcrumb${version_name} .active.section`).replaceWith(`${sectionName}`) - } else { - $(`#file_breadcrumb${version_name} .active.section`).replaceWith(`${sectionName}`) - } - - htmlBrend += `
${filename}
` - htmlBrend += "
/
" - $(`#file_breadcrumb${version_name}`).append(htmlBrend) - $(`input[name=model${version_name}]`).val(parents) - $(`input[name=modelback${version_name}]`).val(filename) - } else { - $(`input[name=model${version_name}]`).val(parents) - $(`input[name=modelback${version_name}]`).val(filename) - $(`#file_breadcrumb${version_name} a.section:contains(${filename})`).nextAll().remove() - $(`#file_breadcrumb${version_name} a.section:contains(${filename})`).replaceWith(`
${filename}
`) - $(`#file_breadcrumb${version_name} div.section:contains(${filename})`).append("
/
") - } - - } - function renderDir(data, version_name) { - let html = "" - html += "
" - html += "
" - html += "
" - html += "
" - html += "" - html += '' - // html += "" - for (let i = 0; i < data.Dirs.length; i++) { - let dirs_size = renderSize(data.Dirs[i].Size) - html += "" - html += "" - html += "" - - html += "" - html += "" - - } - html += "" - html += "
" - html += "" - html += "" - html += "" - if (data.Dirs[i].IsDir) { - html += `` - html += "" + data.Dirs[i].FileName + "" - } else { - if (downlaodFlag) { - html += `` - } - else { - html += `` - } - html += "" + data.Dirs[i].FileName + "" - } - html += '' - html += "" - html += "" - if (data.Dirs[i].IsDir) { - html += "" - } else { - html += "" + `${dirs_size}` + "" - } - - html += "" - html += "" + data.Dirs[i].ModTime + "" - html += "
" - html += "
" - html += "
" - html += "
" - html += "
" - $(`#dir_list${version_name}`).append(html) - } - function renderSize(value) { - if (null == value || value == '') { - return "0 Bytes"; - } - var unitArr = new Array("Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"); - var index = 0; - var srcsize = parseFloat(value); - index = Math.floor(Math.log(srcsize) / Math.log(1024)); - var size = srcsize / Math.pow(1024, index); - size = size.toFixed(0);//保留的小数位数 - return size + unitArr[index]; - } function refreshStatus(version_name) { $.get(`/api/v1/repos/${userName}/${repoPath}/cloudbrain/${taskID}?version_name=${versionname}`, (data) => { diff --git a/templates/repo/grampus/trainjob/show.tmpl b/templates/repo/grampus/trainjob/show.tmpl index 579e83693..e017fd4a0 100755 --- a/templates/repo/grampus/trainjob/show.tmpl +++ b/templates/repo/grampus/trainjob/show.tmpl @@ -273,8 +273,7 @@ data-tab="first{{$k}}">{{$.i18n.Tr "repo.modelarts.train_job.config"}} {{$.i18n.Tr "repo.modelarts.log"}} - {{$.i18n.Tr "repo.model_download"}} + {{$.i18n.Tr "repo.model_download"}}
@@ -658,18 +657,6 @@ $('#name').val(modelName) $('#version').val("0.0.1") } - function renderSize(value) { - if (null == value || value == '') { - return "0 Bytes"; - } - var unitArr = new Array("Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"); - var index = 0; - var srcsize = parseFloat(value); - index = Math.floor(Math.log(srcsize) / Math.log(1024)); - var size = srcsize / Math.pow(1024, index); - size = size.toFixed(0);//保留的小数位数 - return size + unitArr[index]; - } function refreshStatus(version_name) { $.get(`/api/v1/repos/${userName}/${repoPath}/grampus/train-job/${jobID}?version_name=${version_name}`, (data) => { // header status and duration @@ -740,243 +727,4 @@ console.log(err); }); } - function loadModelFile(version_name, parents, filename, init) { - parents = parents || '' - filename = filename || '' - init = init || '' - $.get(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/model_list?version_name=${version_name}&parentDir=${parents}`, (data) => { - $(`#dir_list${version_name}`).empty() - renderDir(data, version_name) - if (init === "init") { - $(`input[name=model${version_name}]`).val("") - $(`input[name=modelback${version_name}]`).val(version_name) - $(`#file_breadcrumb${version_name}`).empty() - let htmlBread = "" - htmlBread += `
${version_name}
` - htmlBread += "
/
" - $(`#file_breadcrumb${version_name}`).append(htmlBread) - } else { - renderBrend(version_name, parents, filename, init) - } - }).fail(function (err) { - console.log(err, version_name); - }); - - } - function renderBrend(version_name, parents, filename, init) { - if (init == "folder") { - let htmlBrend = "" - let sectionName = $(`#file_breadcrumb${version_name} .active.section`).text() - let parents1 = $(`input[name=model${version_name}]`).val() - let filename1 = $(`input[name=modelback${version_name}]`).val() - if (parents1 === "") { - $(`#file_breadcrumb${version_name} .active.section`).replaceWith(`${sectionName}`) - } else { - $(`#file_breadcrumb${version_name} .active.section`).replaceWith(`${sectionName}`) - } - - htmlBrend += `
${filename}
` - htmlBrend += "
/
" - $(`#file_breadcrumb${version_name}`).append(htmlBrend) - $(`input[name=model${version_name}]`).val(parents) - $(`input[name=modelback${version_name}]`).val(filename) - } else { - $(`input[name=model${version_name}]`).val(parents) - $(`input[name=modelback${version_name}]`).val(filename) - $(`#file_breadcrumb${version_name} a.section:contains(${filename})`).nextAll().remove() - $(`#file_breadcrumb${version_name} a.section:contains(${filename})`).replaceWith(`
${filename}
`) - $(`#file_breadcrumb${version_name} div.section:contains(${filename})`).append("
/
") - } - - } - function renderDir(data, version_name) { - let html = "" - html += "
" - html += "
" - html += "
" - html += "
" - html += "" - html += '' - // html += "" - for (let i = 0; i < data.Dirs.length; i++) { - let dirs_size = renderSize(data.Dirs[i].Size) - html += "" - html += "" - html += "" - - html += "" - html += "" - - } - html += "" - html += "
" - html += "" - html += "" - html += "" - if (data.Dirs[i].IsDir) { - html += `` - html += "" + data.Dirs[i].FileName + "" - } else { - if (downlaodFlag) { - html += `` - } - else { - html += `` - } - html += "" + data.Dirs[i].FileName + "" - } - html += '' - html += "" - html += "" - if (data.Dirs[i].IsDir) { - html += "" - } else { - html += "" + `${dirs_size}` + "" - } - - html += "" - html += "" + data.Dirs[i].ModTime + "" - html += "
" - html += "
" - html += "
" - html += "
" - html += "
" - $(`#dir_list${version_name}`).append(html) - } - function debounce(fn, delay) { - let timer; - return (...args) => { - // 判断定时器是否存在,清除定时器 - if (timer) { - clearTimeout(timer); - } - - // 重新调用setTimeout - timer = setTimeout(() => { - fn.apply(this, args); - }, delay); - }; - } - const fn = debounce(logScroll, 500) - function logScroll(version_name) { - let container = document.querySelector(`#log${version_name}`) - let scrollTop = container.scrollTop - let scrollHeight = container.scrollHeight - let clientHeight = container.clientHeight - let scrollLeft = container.scrollLeft - if (((parseInt(scrollTop) + clientHeight == scrollHeight || parseInt(scrollTop) + clientHeight + 1 == scrollHeight || parseInt(scrollTop) + clientHeight - 1 == scrollHeight)) && parseInt(scrollTop) !== 0 && scrollLeft == 0) { - let end_line = $(`#log${version_name} input[name=end_line]`).val() - $.get(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/log?version_name=${version_name}&base_line=${end_line}&lines=50&order=desc`, (data) => { - if (data.Lines == 0) { - $(`.message${version_name} #header`).text('您已翻阅至日志底部') - $(`.message${version_name}`).css('display', 'block') - setTimeout(function () { - $(`.message${version_name}`).css('display', 'none') - }, 1000) - } else { - if (end_line === data.EndLine) { - return - } - else { - $(`#log${version_name} input[name=end_line]`).val(data.EndLine) - $(`#log${version_name}`).append('
' + data.Content)
-                    }
-
-                }
-            }).fail(function (err) {
-                console.log(err);
-            });
-        }
-        if ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10].includes(scrollTop) && scrollLeft == 0) {
-            let start_line = $(`#log${version_name} input[name=start_line]`).val()
-            $.get(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/log?version_name=${version_name}&base_line=${start_line}&lines=50&order=asc`, (data) => {
-                if (data.Lines == 0) {
-                    $(`.message${version_name} #header`).text('您已翻阅至日志顶部')
-                    $(`.message${version_name}`).css('display', 'block')
-                    setTimeout(function () {
-                        $(`.message${version_name}`).css('display', 'none')
-                    }, 1000)
-                } else {
-                    $(`#log${version_name} input[name=start_line]`).val(data.StartLine)   //如果变动就改变所对应的值
-                    $(`#log${version_name}`).prepend('
' + data.Content)
-                }
-            }).fail(function (err) {
-                console.log(err);
-            });
-        }
-    }
-    function scrollAnimation(dom, currentY, targetY, currentX) {
-        let needScrollTop = targetY - currentY;
-        let _currentY = currentY;
-        setTimeout(() => {
-            // 一次调用滑动帧数,每次调用会不一样
-            //取总距离的十分之一
-            const dist = Math.ceil(needScrollTop / 10);
-            _currentY += dist;
-            //移动一个十分之一
-            dom.scrollTo(currentX || 0, _currentY, 'smooth');
-            // 如果移动幅度小于十个像素,直接移动,否则递归调用,实现动画效果
-            if (needScrollTop > 10 || needScrollTop < -10) {
-                scrollAnimation(dom, _currentY, targetY)
-            } else {
-                dom.scrollTo(0, targetY, 'smooth')
-            }
-        }, 1)
-    }
-
-    $('.log_top').click(function () {
-        // let logContentDom = document.querySelector('.log')
-        // if(!logContentDom)
-        //     return
-        // let version_name = $('.log_top').data('version')
-        let version_name = $(this).data('version')
-        let logContentDom = document.querySelector(`#log${version_name}`)
-
-        $(`#log_file${version_name}`).siblings('pre').remove()
-        $.get(`/api/v1/repos/${userName}/${repoPath}/grampus/train-job/${jobID}/log?version_name=${version_name}&base_line=&lines=50&order=asc`, (data) => {
-
-            $(`#log${version_name} input[name=end_line]`).val(data.EndLine)   //如果变动就改变所对应的值
-            $(`#log${version_name} input[name=start_line]`).val(data.StartLine)
-            $(`#log${version_name}`).prepend('
' + data.Content)
-            $(`.message${version_name} #header`).text('您已翻阅至日志顶部')
-            $(`.message${version_name}`).css('display', 'block')
-            setTimeout(function () {
-                $(`.message${version_name}`).css('display', 'none')
-            }, 1000)
-            scrollAnimation(logContentDom, logContentDom.scrollTop, 0);
-        })
-
-    })
-    $('.log_bottom').click(function (e) {
-        let version_name = $(this).data('version')
-        let logContentDom = document.querySelector(`#log${version_name}`)
-        $(`#log_file${version_name}`).siblings('pre').remove()
-        $.get(`/api/v1/repos/${userName}/${repoPath}/grampus/train-job/${jobID}/log?version_name=${version_name}&base_line=&lines=50&order=desc`, (data) => {
-
-            $(`#log${version_name} input[name=end_line]`).val(data.EndLine)   //如果变动就改变所对应的值
-            $(`#log${version_name} input[name=start_line]`).val(data.StartLine)
-            $(`#log${version_name}`).append('
' + data.Content)
-            $.get(`/api/v1/repos/${userName}/${repoPath}/grampus/train-job/${jobID}/log?version_name=${version_name}&base_line=${data.EndLine}&lines=50&order=desc`, (data) => {
-                if (data.Lines == 0) {
-                    $(`.message${version_name} #header`).text('您已翻阅至日志底部')
-                    $(`.message${version_name}`).css('display', 'block')
-                    setTimeout(function () {
-                        $(`.message${version_name}`).css('display', 'none')
-                    }, 1000)
-                } else {
-                    if (end_line === data.EndLine) {
-                        return
-                    }
-                    else {
-                        $(`#log${version_name} input[name=end_line]`).val(data.EndLine)
-                        $(`#log${version_name}`).append('
' + data.Content)
-                    }
-
-                }
-            }).fail(function (err) {
-                console.log(err);
-            });
-            scrollAnimation(logContentDom, logContentDom.scrollTop + 1, logContentDom.scrollHeight - logContentDom.clientHeight);
-        })
-    })
 
\ No newline at end of file
diff --git a/templates/repo/modelarts/inferencejob/show.tmpl b/templates/repo/modelarts/inferencejob/show.tmpl
index b5aadca95..116c464e3 100644
--- a/templates/repo/modelarts/inferencejob/show.tmpl
+++ b/templates/repo/modelarts/inferencejob/show.tmpl
@@ -183,7 +183,7 @@ td, th {
 
                     {{$.i18n.Tr "repo.modelarts.train_job.config"}}
                     {{$.i18n.Tr "repo.modelarts.log"}}
-                    {{$.i18n.Tr "repo.model_download"}}
+                    {{$.i18n.Tr "repo.model_download"}}
                 
@@ -440,7 +440,7 @@ td, th { -
+

@@ -516,241 +516,4 @@ function loadLog(version_name){
         console.log(err);
     });
 }
-function logScroll(version_name) {
-
-    let container = document.querySelector(`#log${version_name}`)
-    let scrollTop = container.scrollTop
-    let scrollHeight = container.scrollHeight
-    let clientHeight = container.clientHeight
-    let scrollLeft = container.scrollLeft
-    if((parseInt(scrollTop)  + clientHeight == scrollHeight || parseInt(scrollTop)  + clientHeight +1 == scrollHeight || parseInt(scrollTop)  + clientHeight - 1 == scrollHeight) && (scrollLeft===0)){
-        let end_line = $(`#log${version_name} input[name=end_line]`).val()
-        $.get(`/api/v1/repos/${userName}/${repoPath}/modelarts/inference-job/${jobID}/log?version_name=${version_name}&base_line=${end_line}&lines=50&order=desc`, (data) => {
-            if (data.Lines == 0){
-                $(`.message${version_name} #header`).text('您已翻阅至日志底部')
-                $(`.message${version_name}`).css('display', 'block')
-                setTimeout(function(){
-                    $(`.message${version_name}`).css('display', 'none')
-                }, 1000)
-            }else{
-                if(end_line===data.EndLine){
-                    return
-                }
-                else{
-                    $(`#log${version_name} input[name=end_line]`).val(data.EndLine)
-                    $(`#log${version_name}`).append('
' + data.Content)
-                }
-
-            }
-        }).fail(function(err) {
-            console.log(err);
-        });
-    }
-    if(scrollTop == 0 && scrollLeft==0){
-        let start_line = $(`#log${version_name} input[name=start_line]`).val()
-        $.get(`/api/v1/repos/${userName}/${repoPath}/modelarts/inference-job/${jobID}/log?version_name=${version_name}&base_line=${start_line}&lines=50&order=asc`, (data) => {
-            if (data.Lines == 0){
-                $(`.message${version_name} #header`).text('您已翻阅至日志顶部')
-                $(`.message${version_name}`).css('display', 'block')
-                setTimeout(function(){
-                    $(`.message${version_name}`).css('display', 'none')
-                }, 1000)
-            }else{
-                $(`#log${version_name} input[name=start_line]`).val(data.StartLine)   //如果变动就改变所对应的值
-                $(`#log${version_name}`).prepend('
' + data.Content)
-            }
-        }).fail(function(err) {
-            console.log(err);
-        });
-    }
-}
-function renderSize(value){
-    if(null==value||value==''){
-        return "0 Bytes";
-    }
-    var unitArr = new Array("Bytes","KB","MB","GB","TB","PB","EB","ZB","YB");
-    var index=0;
-    var srcsize = parseFloat(value);
-    index=Math.floor(Math.log(srcsize)/Math.log(1024));
-    var size =srcsize/Math.pow(1024,index);
-    size=size.toFixed(0);//保留的小数位数
-    return size+unitArr[index];
-}
-function loadModelFile(version_name,parents,filename,init){
-    parents = parents || ''
-    filename = filename || ''
-    init = init || ''
-    $.get(`/api/v1/repos/${userName}/${repoPath}/modelarts/inference-job/${jobID}/result_list?version_name=${version_name}&parentDir=${parents}`, (data) => {
-            $(`#dir_list${version_name}`).empty()
-            renderDir(data,version_name)
-            if(init==="init"){
-                $(`input[name=model${version_name}]`).val("")
-                $(`input[name=modelback${version_name}]`).val(version_name)
-                $(`#file_breadcrumb${version_name}`).empty()
-                let htmlBread = ""
-                htmlBread += `
result
` - htmlBread += "
/
" - $(`#file_breadcrumb${version_name}`).append(htmlBread) - }else{ - renderBrend(version_name,parents,filename,init) - } - }).fail(function(err) { - console.log(err,version_name); - }); - -} -function renderBrend(version_name,parents,filename,init){ - if(init=="folder"){ - let htmlBrend = "" - let sectionName=$(`#file_breadcrumb${version_name} .active.section`).text() - let parents1 = $(`input[name=model${version_name}]`).val() - let filename1 = $(`input[name=modelback${version_name}]`).val() - if(parents1===""){ - $(`#file_breadcrumb${version_name} .active.section`).replaceWith(`${sectionName}`) - }else{ - $(`#file_breadcrumb${version_name} .active.section`).replaceWith(`${sectionName}`) - } - - htmlBrend += `
${filename}
` - htmlBrend += "
/
" - $(`#file_breadcrumb${version_name}`).append(htmlBrend) - $(`input[name=model${version_name}]`).val(parents) - $(`input[name=modelback${version_name}]`).val(filename) - }else{ - $(`input[name=model${version_name}]`).val(parents) - $(`input[name=modelback${version_name}]`).val(filename) - $(`#file_breadcrumb${version_name} a.section:contains(${filename})`).nextAll().remove() - $(`#file_breadcrumb${version_name} a.section:contains(${filename})`).replaceWith(`
${filename}
`) - $(`#file_breadcrumb${version_name} div.section:contains(${filename})`).append("
/
") - } - -} -function renderDir(data,version_name){ - let html="" - html += "
" - html += "
" - html += "
" - html += "
" - html += "" - html += '' - // html += "" - for(let i=0;i` - html += "" + data.Dirs[i].FileName + "" - }else{ - if(downlaodFlag){ - html += `` - } - else{ - html += `` - } - html += "" + data.Dirs[i].FileName + "" - } - html += '' - html += "" - html += "" - html += "" - - html += "" - html += "" - - } - html += "" - html += "
" - if(data.Dirs[i].IsDir){ - html += "" - }else{ - html += ""+ `${dirs_size}` + "" - } - - html += "" - html += "" + data.Dirs[i].ModTime + "" - html += "
" - html += "
" - html += "
" - html += "
" - html += "
" - $(`#dir_list${version_name}`).append(html) -} -function scrollAnimation(dom, currentY, targetY, currentX) { - let needScrollTop = targetY - currentY; - let _currentY = currentY; - setTimeout(() => { - // 一次调用滑动帧数,每次调用会不一样 - //取总距离的十分之一 - const dist = Math.ceil(needScrollTop / 10); - _currentY += dist; - //移动一个十分之一 - dom.scrollTo(currentX || 0, _currentY, 'smooth'); - // 如果移动幅度小于十个像素,直接移动,否则递归调用,实现动画效果 - if (needScrollTop > 10 || needScrollTop < -10) { - scrollAnimation(dom, _currentY, targetY) - } else { - dom.scrollTo(0, targetY, 'smooth') - } - }, 1) - } - - $('.log_top').click(function () { - // let logContentDom = document.querySelector('.log') - // if(!logContentDom) - // return - // let version_name = $('.log_top').data('version') - let version_name = $(this).data('version') - let logContentDom = document.querySelector(`#log${version_name}`) - - $(`#log_file${version_name}`).siblings('pre').remove() - $.get(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/log?version_name=${version_name}&base_line=&lines=50&order=asc`, (data) => { - - $(`#log${version_name} input[name=end_line]`).val(data.EndLine) //如果变动就改变所对应的值 - $(`#log${version_name} input[name=start_line]`).val(data.StartLine) - $(`#log${version_name}`).prepend('
' + data.Content)
-            $(`.message${version_name} #header`).text('您已翻阅至日志顶部')
-            $(`.message${version_name}`).css('display', 'block')
-            setTimeout(function () {
-                $(`.message${version_name}`).css('display', 'none')
-            }, 1000)
-            scrollAnimation(logContentDom, logContentDom.scrollTop, 0);
-        })
-
-    })
-    $('.log_bottom').click(function (e) {
-        let version_name = $(this).data('version')
-        let logContentDom = document.querySelector(`#log${version_name}`)
-        $(`#log_file${version_name}`).siblings('pre').remove()
-        $.get(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/log?version_name=${version_name}&base_line=&lines=50&order=desc`, (data) => {
-
-            $(`#log${version_name} input[name=end_line]`).val(data.EndLine)   //如果变动就改变所对应的值
-            $(`#log${version_name} input[name=start_line]`).val(data.StartLine)
-            $(`#log${version_name}`).append('
' + data.Content)
-            $.get(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/log?version_name=${version_name}&base_line=${data.EndLine}&lines=50&order=desc`, (data) => {
-                if (data.Lines == 0) {
-                    $(`.message${version_name} #header`).text('您已翻阅至日志底部')
-                    $(`.message${version_name}`).css('display', 'block')
-                    setTimeout(function () {
-                        $(`.message${version_name}`).css('display', 'none')
-                    }, 1000)
-                } else {
-                    if (end_line === data.EndLine) {
-                        return
-                    }
-                    else {
-                        $(`#log${version_name} input[name=end_line]`).val(data.EndLine)
-                        $(`#log${version_name}`).append('
' + data.Content)
-                    }
-
-                }
-            }).fail(function (err) {
-                console.log(err);
-            });
-            scrollAnimation(logContentDom, logContentDom.scrollTop + 1, logContentDom.scrollHeight - logContentDom.clientHeight);
-        })
-    })
 
diff --git a/templates/repo/modelarts/trainjob/show.tmpl b/templates/repo/modelarts/trainjob/show.tmpl
index 615fc3030..cd8fc88de 100755
--- a/templates/repo/modelarts/trainjob/show.tmpl
+++ b/templates/repo/modelarts/trainjob/show.tmpl
@@ -313,8 +313,7 @@
                         {{$.i18n.Tr "repo.modelarts.log"}}
                         资源占用情况
-                        {{$.i18n.Tr "repo.model_download"}}
+                        {{$.i18n.Tr "repo.model_download"}}
                     
@@ -509,7 +508,7 @@ -
@@ -727,18 +726,6 @@ $('#name').val(modelName) $('#version').val("0.0.1") } - function renderSize(value) { - if (null == value || value == '') { - return "0 Bytes"; - } - var unitArr = new Array("Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"); - var index = 0; - var srcsize = parseFloat(value); - index = Math.floor(Math.log(srcsize) / Math.log(1024)); - var size = srcsize / Math.pow(1024, index); - size = size.toFixed(0);//保留的小数位数 - return size + unitArr[index]; - } function refreshStatus(version_name) { $.get(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}?version_name=${version_name}`, (data) => { // header status and duration @@ -811,243 +798,5 @@ console.log(err); }); } - function loadModelFile(version_name, parents, filename, init) { - parents = parents || '' - filename = filename || '' - init = init || '' - $.get(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/model_list?version_name=${version_name}&parentDir=${parents}`, (data) => { - $(`#dir_list${version_name}`).empty() - renderDir(data, version_name) - if (init === "init") { - $(`input[name=model${version_name}]`).val("") - $(`input[name=modelback${version_name}]`).val(version_name) - $(`#file_breadcrumb${version_name}`).empty() - let htmlBread = "" - htmlBread += `
${version_name}
` - htmlBread += "
/
" - $(`#file_breadcrumb${version_name}`).append(htmlBread) - } else { - renderBrend(version_name, parents, filename, init) - } - }).fail(function (err) { - console.log(err, version_name); - }); - - } - function renderBrend(version_name, parents, filename, init) { - if (init == "folder") { - let htmlBrend = "" - let sectionName = $(`#file_breadcrumb${version_name} .active.section`).text() - let parents1 = $(`input[name=model${version_name}]`).val() - let filename1 = $(`input[name=modelback${version_name}]`).val() - if (parents1 === "") { - $(`#file_breadcrumb${version_name} .active.section`).replaceWith(`${sectionName}`) - } else { - $(`#file_breadcrumb${version_name} .active.section`).replaceWith(`${sectionName}`) - } - - htmlBrend += `
${filename}
` - htmlBrend += "
/
" - $(`#file_breadcrumb${version_name}`).append(htmlBrend) - $(`input[name=model${version_name}]`).val(parents) - $(`input[name=modelback${version_name}]`).val(filename) - } else { - $(`input[name=model${version_name}]`).val(parents) - $(`input[name=modelback${version_name}]`).val(filename) - $(`#file_breadcrumb${version_name} a.section:contains(${filename})`).nextAll().remove() - $(`#file_breadcrumb${version_name} a.section:contains(${filename})`).replaceWith(`
${filename}
`) - $(`#file_breadcrumb${version_name} div.section:contains(${filename})`).append("
/
") - } - - } - function renderDir(data, version_name) { - let html = "" - html += "
" - html += "
" - html += "
" - html += "
" - html += "" - html += '' - // html += "" - for (let i = 0; i < data.Dirs.length; i++) { - let dirs_size = renderSize(data.Dirs[i].Size) - html += "" - html += "" - html += "" - - html += "" - html += "" - - } - html += "" - html += "
" - html += "" - html += "" - html += "" - if (data.Dirs[i].IsDir) { - html += `` - html += "" + data.Dirs[i].FileName + "" - } else { - if (downlaodFlag) { - html += `` - } - else { - html += `` - } - html += "" + data.Dirs[i].FileName + "" - } - html += '' - html += "" - html += "" - if (data.Dirs[i].IsDir) { - html += "" - } else { - html += "" + `${dirs_size}` + "" - } - - html += "" - html += "" + data.Dirs[i].ModTime + "" - html += "
" - html += "
" - html += "
" - html += "
" - html += "
" - $(`#dir_list${version_name}`).append(html) - } - function debounce(fn, delay) { - let timer; - return (...args) => { - // 判断定时器是否存在,清除定时器 - if (timer) { - clearTimeout(timer); - } - - // 重新调用setTimeout - timer = setTimeout(() => { - fn.apply(this, args); - }, delay); - }; - } - const fn = debounce(logScroll, 500) - function logScroll(version_name) { - let container = document.querySelector(`#log${version_name}`) - let scrollTop = container.scrollTop - let scrollHeight = container.scrollHeight - let clientHeight = container.clientHeight - let scrollLeft = container.scrollLeft - if (((parseInt(scrollTop) + clientHeight == scrollHeight || parseInt(scrollTop) + clientHeight + 1 == scrollHeight || parseInt(scrollTop) + clientHeight - 1 == scrollHeight)) && parseInt(scrollTop) !== 0 && scrollLeft == 0) { - let end_line = $(`#log${version_name} input[name=end_line]`).val() - $.get(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/log?version_name=${version_name}&base_line=${end_line}&lines=50&order=desc`, (data) => { - if (data.Lines == 0) { - $(`.message${version_name} #header`).text('您已翻阅至日志底部') - $(`.message${version_name}`).css('display', 'block') - setTimeout(function () { - $(`.message${version_name}`).css('display', 'none') - }, 1000) - } else { - if (end_line === data.EndLine) { - return - } - else { - $(`#log${version_name} input[name=end_line]`).val(data.EndLine) - $(`#log${version_name}`).append('
' + data.Content)
-                    }
-
-                }
-            }).fail(function (err) {
-                console.log(err);
-            });
-        }
-        if ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10].includes(scrollTop) && scrollLeft == 0) {
-            let start_line = $(`#log${version_name} input[name=start_line]`).val()
-            $.get(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/log?version_name=${version_name}&base_line=${start_line}&lines=50&order=asc`, (data) => {
-                if (data.Lines == 0) {
-                    $(`.message${version_name} #header`).text('您已翻阅至日志顶部')
-                    $(`.message${version_name}`).css('display', 'block')
-                    setTimeout(function () {
-                        $(`.message${version_name}`).css('display', 'none')
-                    }, 1000)
-                } else {
-                    $(`#log${version_name} input[name=start_line]`).val(data.StartLine)   //如果变动就改变所对应的值
-                    $(`#log${version_name}`).prepend('
' + data.Content)
-                }
-            }).fail(function (err) {
-                console.log(err);
-            });
-        }
-    }
-    function scrollAnimation(dom, currentY, targetY, currentX) {
-        let needScrollTop = targetY - currentY;
-        let _currentY = currentY;
-        setTimeout(() => {
-            // 一次调用滑动帧数,每次调用会不一样
-            //取总距离的十分之一
-            const dist = Math.ceil(needScrollTop / 10);
-            _currentY += dist;
-            //移动一个十分之一
-            dom.scrollTo(currentX || 0, _currentY, 'smooth');
-            // 如果移动幅度小于十个像素,直接移动,否则递归调用,实现动画效果
-            if (needScrollTop > 10 || needScrollTop < -10) {
-                scrollAnimation(dom, _currentY, targetY)
-            } else {
-                dom.scrollTo(0, targetY, 'smooth')
-            }
-        }, 1)
-    }
-
-    $('.log_top').click(function () {
-        // let logContentDom = document.querySelector('.log')
-        // if(!logContentDom)
-        //     return
-        // let version_name = $('.log_top').data('version')
-        let version_name = $(this).data('version')
-        let logContentDom = document.querySelector(`#log${version_name}`)
-
-        $(`#log_file${version_name}`).siblings('pre').remove()
-        $.get(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/log?version_name=${version_name}&base_line=&lines=50&order=asc`, (data) => {
-
-            $(`#log${version_name} input[name=end_line]`).val(data.EndLine)   //如果变动就改变所对应的值
-            $(`#log${version_name} input[name=start_line]`).val(data.StartLine)
-            $(`#log${version_name}`).prepend('
' + data.Content)
-            $(`.message${version_name} #header`).text('您已翻阅至日志顶部')
-            $(`.message${version_name}`).css('display', 'block')
-            setTimeout(function () {
-                $(`.message${version_name}`).css('display', 'none')
-            }, 1000)
-            scrollAnimation(logContentDom, logContentDom.scrollTop, 0);
-        })
-
-    })
-    $('.log_bottom').click(function (e) {
-        let version_name = $(this).data('version')
-        let logContentDom = document.querySelector(`#log${version_name}`)
-        $(`#log_file${version_name}`).siblings('pre').remove()
-        $.get(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/log?version_name=${version_name}&base_line=&lines=50&order=desc`, (data) => {
-
-            $(`#log${version_name} input[name=end_line]`).val(data.EndLine)   //如果变动就改变所对应的值
-            $(`#log${version_name} input[name=start_line]`).val(data.StartLine)
-            $(`#log${version_name}`).append('
' + data.Content)
-            $.get(`/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/log?version_name=${version_name}&base_line=${data.EndLine}&lines=50&order=desc`, (data) => {
-                if (data.Lines == 0) {
-                    $(`.message${version_name} #header`).text('您已翻阅至日志底部')
-                    $(`.message${version_name}`).css('display', 'block')
-                    setTimeout(function () {
-                        $(`.message${version_name}`).css('display', 'none')
-                    }, 1000)
-                } else {
-                    if (end_line === data.EndLine) {
-                        return
-                    }
-                    else {
-                        $(`#log${version_name} input[name=end_line]`).val(data.EndLine)
-                        $(`#log${version_name}`).append('
' + data.Content)
-                    }
-
-                }
-            }).fail(function (err) {
-                console.log(err);
-            });
-            scrollAnimation(logContentDom, logContentDom.scrollTop + 1, logContentDom.scrollHeight - logContentDom.clientHeight);
-        })
-    })
+    
 
\ No newline at end of file
diff --git a/web_src/js/features/cloudbrainShow.js b/web_src/js/features/cloudbrainShow.js
new file mode 100644
index 000000000..864ea345f
--- /dev/null
+++ b/web_src/js/features/cloudbrainShow.js
@@ -0,0 +1,309 @@
+export default async function initCloudrainSow() {
+  function debounce(fn, delay) {
+    let timer;
+    return (...args) => {
+      // 判断定时器是否存在,清除定时器
+      if (timer) {
+        clearTimeout(timer);
+      }
+
+      // 重新调用setTimeout
+      timer = setTimeout(() => {
+        fn.apply(this, args);
+      }, delay);
+    };
+  }
+
+  function logScroll(version_name) {
+    let container = document.querySelector(`#log${version_name}`);
+    let scrollTop = container.scrollTop;
+    let scrollHeight = container.scrollHeight;
+    let clientHeight = container.clientHeight;
+    let scrollLeft = container.scrollLeft;
+    if (
+      (parseInt(scrollTop) + clientHeight == scrollHeight ||
+        parseInt(scrollTop) + clientHeight + 1 == scrollHeight ||
+        parseInt(scrollTop) + clientHeight - 1 == scrollHeight) &&
+      scrollLeft === 0
+    ) {
+      let end_line = $(`#log${version_name} input[name=end_line]`).val();
+      $.get(
+        `/api/v1/repos/${userName}/${repoPath}/modelarts/inference-job/${jobID}/log?version_name=${version_name}&base_line=${end_line}&lines=50&order=desc`,
+        (data) => {
+          if (data.Lines == 0) {
+            $(`.message${version_name} #header`).text("您已翻阅至日志底部");
+            $(`.message${version_name}`).css("display", "block");
+            setTimeout(function () {
+              $(`.message${version_name}`).css("display", "none");
+            }, 1000);
+          } else {
+            if (end_line === data.EndLine) {
+              return;
+            } else {
+              $(`#log${version_name} input[name=end_line]`).val(data.EndLine);
+              $(`#log${version_name}`).append("
" + data.Content);
+            }
+          }
+        }
+      ).fail(function (err) {
+        console.log(err);
+      });
+    }
+    if (scrollTop == 0 && scrollLeft == 0) {
+      let start_line = $(`#log${version_name} input[name=start_line]`).val();
+      $.get(
+        `/api/v1/repos/${userName}/${repoPath}/modelarts/inference-job/${jobID}/log?version_name=${version_name}&base_line=${start_line}&lines=50&order=asc`,
+        (data) => {
+          if (data.Lines == 0) {
+            $(`.message${version_name} #header`).text("您已翻阅至日志顶部");
+            $(`.message${version_name}`).css("display", "block");
+            setTimeout(function () {
+              $(`.message${version_name}`).css("display", "none");
+            }, 1000);
+          } else {
+            $(`#log${version_name} input[name=start_line]`).val(data.StartLine); //如果变动就改变所对应的值
+            $(`#log${version_name}`).prepend("
" + data.Content);
+          }
+        }
+      ).fail(function (err) {
+        console.log(err);
+      });
+    }
+  }
+  const fn = debounce(logScroll, 500);
+  $(".log-scroll").scroll(function () {
+    let version_name = $(this).data("version");
+    fn(version_name);
+  });
+  function scrollAnimation(dom, currentY, targetY, currentX) {
+    let needScrollTop = targetY - currentY;
+    let _currentY = currentY;
+    setTimeout(() => {
+      // 一次调用滑动帧数,每次调用会不一样
+      //取总距离的十分之一
+      const dist = Math.ceil(needScrollTop / 10);
+      _currentY += dist;
+      //移动一个十分之一
+      dom.scrollTo(currentX || 0, _currentY, "smooth");
+      // 如果移动幅度小于十个像素,直接移动,否则递归调用,实现动画效果
+      if (needScrollTop > 10 || needScrollTop < -10) {
+        scrollAnimation(dom, _currentY, targetY);
+      } else {
+        dom.scrollTo(0, targetY, "smooth");
+      }
+    }, 1);
+  }
+
+  $(".log_top").click(function () {
+    // let logContentDom = document.querySelector('.log')
+    // if(!logContentDom)
+    //     return
+    // let version_name = $('.log_top').data('version')
+    let version_name = $(this).data("version");
+    let logContentDom = document.querySelector(`#log${version_name}`);
+
+    $(`#log_file${version_name}`).siblings("pre").remove();
+    $.get(
+      `/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/log?version_name=${version_name}&base_line=&lines=50&order=asc`,
+      (data) => {
+        $(`#log${version_name} input[name=end_line]`).val(data.EndLine); //如果变动就改变所对应的值
+        $(`#log${version_name} input[name=start_line]`).val(data.StartLine);
+        $(`#log${version_name}`).prepend("
" + data.Content);
+        $(`.message${version_name} #header`).text("您已翻阅至日志顶部");
+        $(`.message${version_name}`).css("display", "block");
+        setTimeout(function () {
+          $(`.message${version_name}`).css("display", "none");
+        }, 1000);
+        scrollAnimation(logContentDom, logContentDom.scrollTop, 0);
+      }
+    );
+  });
+  $(".log_bottom").click(function (e) {
+    let version_name = $(this).data("version");
+    let logContentDom = document.querySelector(`#log${version_name}`);
+    $(`#log_file${version_name}`).siblings("pre").remove();
+    $.get(
+      `/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/log?version_name=${version_name}&base_line=&lines=50&order=desc`,
+      (data) => {
+        $(`#log${version_name} input[name=end_line]`).val(data.EndLine); //如果变动就改变所对应的值
+        $(`#log${version_name} input[name=start_line]`).val(data.StartLine);
+        $(`#log${version_name}`).append("
" + data.Content);
+        $.get(
+          `/api/v1/repos/${userName}/${repoPath}/modelarts/train-job/${jobID}/log?version_name=${version_name}&base_line=${data.EndLine}&lines=50&order=desc`,
+          (data) => {
+            if (data.Lines == 0) {
+              $(`.message${version_name} #header`).text("您已翻阅至日志底部");
+              $(`.message${version_name}`).css("display", "block");
+              setTimeout(function () {
+                $(`.message${version_name}`).css("display", "none");
+              }, 1000);
+            } else {
+              if (end_line === data.EndLine) {
+                return;
+              } else {
+                $(`#log${version_name} input[name=end_line]`).val(data.EndLine);
+                $(`#log${version_name}`).append("
" + data.Content);
+              }
+            }
+          }
+        ).fail(function (err) {
+          console.log(err);
+        });
+        scrollAnimation(
+          logContentDom,
+          logContentDom.scrollTop + 1,
+          logContentDom.scrollHeight - logContentDom.clientHeight
+        );
+      }
+    );
+  });
+
+  //
+  $(".content-pad").on("click", ".load-model-file", function () {
+    console.log("11111111111");
+    let version_name = $(this).data("version");
+    let parents = $(this).data("parents") || "";
+    let filename = $(this).data("filename") || "";
+    let init = $(this).data("init") || "";
+    let path = $(this).data("path");
+    let url = `/api/v1/repos${path}?version_name=${version_name}&parentDir=${parents}`;
+    console.log(url);
+    $.get(url, (data) => {
+      $(`#dir_list${version_name}`).empty();
+      renderDir(path, data, version_name);
+      if (init === "init") {
+        $(`input[name=model${version_name}]`).val("");
+        $(`input[name=modelback${version_name}]`).val(version_name);
+        $(`#file_breadcrumb${version_name}`).empty();
+        let htmlBread = "";
+        htmlBread += `
${version_name}
`; + htmlBread += "
/
"; + $(`#file_breadcrumb${version_name}`).append(htmlBread); + } else { + renderBrend(path, version_name, parents, filename, init); + } + }).fail(function (err) { + console.log(err, version_name); + }); + }); + function renderSize(value) { + if (null == value || value == "") { + return "0 Bytes"; + } + var unitArr = new Array( + "Bytes", + "KB", + "MB", + "GB", + "TB", + "PB", + "EB", + "ZB", + "YB" + ); + var index = 0; + var srcsize = parseFloat(value); + index = Math.floor(Math.log(srcsize) / Math.log(1024)); + var size = srcsize / Math.pow(1024, index); + size = size.toFixed(0); //保留的小数位数 + return size + unitArr[index]; + } + function renderBrend(path, version_name, parents, filename, init) { + if (init == "folder") { + let htmlBrend = ""; + let sectionName = $( + `#file_breadcrumb${version_name} .active.section` + ).text(); + let parents1 = $(`input[name=model${version_name}]`).val(); + let filename1 = $(`input[name=modelback${version_name}]`).val(); + if (parents1 === "") { + $(`#file_breadcrumb${version_name} .active.section`).replaceWith( + `${sectionName}` + ); + } else { + $(`#file_breadcrumb${version_name} .active.section`).replaceWith( + `${sectionName}` + ); + } + + htmlBrend += `
${filename}
`; + htmlBrend += "
/
"; + $(`#file_breadcrumb${version_name}`).append(htmlBrend); + $(`input[name=model${version_name}]`).val(parents); + $(`input[name=modelback${version_name}]`).val(filename); + } else { + $(`input[name=model${version_name}]`).val(parents); + $(`input[name=modelback${version_name}]`).val(filename); + $(`#file_breadcrumb${version_name} a.section:contains(${filename})`) + .nextAll() + .remove(); + $( + `#file_breadcrumb${version_name} a.section:contains(${filename})` + ).replaceWith(`
${filename}
`); + $( + `#file_breadcrumb${version_name} div.section:contains(${filename})` + ).append("
/
"); + } + } + + function renderDir(path, data, version_name) { + let html = ""; + html += "
"; + html += "
"; + html += "
"; + html += "
"; + html += ""; + html += ""; + // html += "" + for (let i = 0; i < data.Dirs.length; i++) { + let dirs_size = renderSize(data.Dirs[i].Size); + html += ""; + html += ""; + html += ""; + + html += ""; + html += ""; + } + html += ""; + html += "
"; + html += ""; + html += ""; + html += ""; + if (data.Dirs[i].IsDir) { + html += ``; + html += + "" + + data.Dirs[i].FileName + + ""; + } else { + if (downlaodFlag) { + html += ``; + } else { + html += ``; + } + html += + "" + + data.Dirs[i].FileName + + ""; + } + html += ""; + html += ""; + html += ""; + if (data.Dirs[i].IsDir) { + html += ""; + } else { + html += + "" + `${dirs_size}` + ""; + } + + html += ""; + html += + "" + data.Dirs[i].ModTime + ""; + html += "
"; + html += "
"; + html += "
"; + html += "
"; + html += "
"; + $(`#dir_list${version_name}`).append(html); + } +} diff --git a/web_src/js/index.js b/web_src/js/index.js index 754d6ca76..53dba8a88 100755 --- a/web_src/js/index.js +++ b/web_src/js/index.js @@ -43,6 +43,7 @@ import Contributors from "./components/Contributors.vue"; import Model from "./components/Model.vue"; import WxAutorize from "./components/WxAutorize.vue"; import initCloudrain from "./features/cloudrbanin.js"; +import initCloudrainSow from "./features/cloudbrainShow.js"; import initImage from "./features/images.js"; import selectDataset from "./components/dataset/selectDataset.vue"; // import $ from 'jquery.js' @@ -2917,6 +2918,7 @@ $(document).ready(async () => { initTribute(); initDropDown(); initCloudrain(); + initCloudrainSow(); initImage(); initContextMenu(); @@ -3711,9 +3713,9 @@ function initVueDataset() { if (!el) { return; } - let link = $('#square-link').data('link') - let repolink = $('.dataset-repolink').data('repolink') - let datasetType = $('.dataset-repolink').data('dataset-type') + let link = $("#square-link").data("link"); + let repolink = $(".dataset-repolink").data("repolink"); + let datasetType = $(".dataset-repolink").data("dataset-type"); const clearBtn = document.getElementsByClassName("clear_dataset_value"); const params = new URLSearchParams(location.search); for (let i = 0; i < clearBtn.length; i++) { @@ -3873,10 +3875,10 @@ function initVueDataset() { mounted() { this.getTypeList(); - if (!!document.getElementById('dataset-repolink-init')) { + if (!!document.getElementById("dataset-repolink-init")) { // this.datasetType = location.href.indexOf('cloudbrain') !== -1 ? 0 : 1 - this.datasetType = $('#dataset-repolink-init').data("dataset-type") - this.getCurrentRepoDataset(this.repolink, this.datasetType) + this.datasetType = $("#dataset-repolink-init").data("dataset-type"); + this.getCurrentRepoDataset(this.repolink, this.datasetType); } const params = new URLSearchParams(location.search); @@ -3897,13 +3899,13 @@ function initVueDataset() { this.ruleForm1 = ruleForm; // this.getEditInit() - this.starItems = starItems - this.starActives = starActives - this.taskLists = taskLists - this.licenseLists = licenseLists - this.descfile = dataset_file_desc - this.repolink = repolink - this.datasetType = datasetType + this.starItems = starItems; + this.starActives = starActives; + this.taskLists = taskLists; + this.licenseLists = licenseLists; + this.descfile = dataset_file_desc; + this.repolink = repolink; + this.datasetType = datasetType; }, methods: { copyUrl(url) { @@ -3924,18 +3926,18 @@ function initVueDataset() { handleCurrentChange(val) { this.page = val; switch (this.activeName) { - case 'first': - this.getCurrentRepoDataset(this.repolink, this.datasetType) - break - case 'second': - this.getMyDataset(this.repolink, this.datasetType) - break - case 'third': - this.getPublicDataset(this.repolink, this.datasetType) - break - case 'fourth': - this.getStarDataset(this.repolink, this.datasetType) - break + case "first": + this.getCurrentRepoDataset(this.repolink, this.datasetType); + break; + case "second": + this.getMyDataset(this.repolink, this.datasetType); + break; + case "third": + this.getPublicDataset(this.repolink, this.datasetType); + break; + case "fourth": + this.getStarDataset(this.repolink, this.datasetType); + break; } }, handleCheckedChange(val) { @@ -4276,18 +4278,18 @@ function initVueDataset() { }, refreshStatusDataset() { switch (this.activeName) { - case 'first': - this.getCurrentRepoDataset(this.repolink, this.datasetType) - break - case 'second': - this.getMyDataset(this.repolink, this.datasetType) - break - case 'third': - this.getPublicDataset(this.repolink, this.datasetType) - break - case 'fourth': - this.getStarDataset(this.repolink, this.datasetType) - break + case "first": + this.getCurrentRepoDataset(this.repolink, this.datasetType); + break; + case "second": + this.getMyDataset(this.repolink, this.datasetType); + break; + case "third": + this.getPublicDataset(this.repolink, this.datasetType); + break; + case "fourth": + this.getStarDataset(this.repolink, this.datasetType); + break; } }, getCurrentRepoDataset(repoLink, type) { @@ -4398,44 +4400,44 @@ function initVueDataset() { }, searchDataset() { switch (this.activeName) { - case 'first': - this.page = 1 - this.getCurrentRepoDataset(this.repolink, this.datasetType) - break - case 'second': - this.page = 1 - this.getMyDataset(this.repolink, this.datasetType) - break - case 'third': - this.page = 1 - this.getPublicDataset(this.repolink, this.datasetType) - break - case 'fourth': - this.page = 1 - this.getStarDataset(this.repolink, this.datasetType) - break + case "first": + this.page = 1; + this.getCurrentRepoDataset(this.repolink, this.datasetType); + break; + case "second": + this.page = 1; + this.getMyDataset(this.repolink, this.datasetType); + break; + case "third": + this.page = 1; + this.getPublicDataset(this.repolink, this.datasetType); + break; + case "fourth": + this.page = 1; + this.getStarDataset(this.repolink, this.datasetType); + break; } }, }, watch: { searchDataItem() { switch (this.activeName) { - case 'first': - this.page = 1 - this.getCurrentRepoDataset(this.repolink, this.datasetType) - break - case 'second': - this.page = 1 - this.getMyDataset(this.repolink, this.datasetType) - break - case 'third': - this.page = 1 - this.getPublicDataset(this.repolink, this.datasetType) - break - case 'fourth': - this.page = 1 - this.getStarDataset(this.repolink, this.datasetType) - break + case "first": + this.page = 1; + this.getCurrentRepoDataset(this.repolink, this.datasetType); + break; + case "second": + this.page = 1; + this.getMyDataset(this.repolink, this.datasetType); + break; + case "third": + this.page = 1; + this.getPublicDataset(this.repolink, this.datasetType); + break; + case "fourth": + this.page = 1; + this.getStarDataset(this.repolink, this.datasetType); + break; } }, }, From 000cde79e54abc26a4aa5cb23e57f59746c870d3 Mon Sep 17 00:00:00 2001 From: zhoupzh Date: Mon, 11 Jul 2022 15:59:53 +0800 Subject: [PATCH 345/424] fix issue --- templates/repo/cloudbrain/inference/show.tmpl | 2 +- templates/repo/cloudbrain/trainjob/show.tmpl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/repo/cloudbrain/inference/show.tmpl b/templates/repo/cloudbrain/inference/show.tmpl index b02c9694b..380a59d16 100644 --- a/templates/repo/cloudbrain/inference/show.tmpl +++ b/templates/repo/cloudbrain/inference/show.tmpl @@ -492,7 +492,7 @@ diff --git a/templates/repo/cloudbrain/trainjob/show.tmpl b/templates/repo/cloudbrain/trainjob/show.tmpl index 3f66de0a3..ede7f322d 100644 --- a/templates/repo/cloudbrain/trainjob/show.tmpl +++ b/templates/repo/cloudbrain/trainjob/show.tmpl @@ -466,7 +466,7 @@ From 574a02c16123452d8aec81bbcf028ea20f41a855 Mon Sep 17 00:00:00 2001 From: zhoupzh Date: Mon, 11 Jul 2022 16:22:35 +0800 Subject: [PATCH 346/424] fix issue --- web_src/js/features/cloudbrainShow.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web_src/js/features/cloudbrainShow.js b/web_src/js/features/cloudbrainShow.js index 864ea345f..3e556280f 100644 --- a/web_src/js/features/cloudbrainShow.js +++ b/web_src/js/features/cloudbrainShow.js @@ -161,7 +161,7 @@ export default async function initCloudrainSow() { // $(".content-pad").on("click", ".load-model-file", function () { console.log("11111111111"); - let version_name = $(this).data("version"); + let version_name = $(this).data("version") || "result"; let parents = $(this).data("parents") || ""; let filename = $(this).data("filename") || ""; let init = $(this).data("init") || ""; From 7f1cffd7f1a9e3c118eebc3bc33cc028abf07168 Mon Sep 17 00:00:00 2001 From: zhoupzh Date: Mon, 11 Jul 2022 16:54:18 +0800 Subject: [PATCH 347/424] fix issue --- templates/custom/wait_count_train.tmpl | 20 ++++++++++++++++---- web_src/js/features/cloudbrainShow.js | 8 ++++++-- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/templates/custom/wait_count_train.tmpl b/templates/custom/wait_count_train.tmpl index 085fa173f..661eb268d 100644 --- a/templates/custom/wait_count_train.tmpl +++ b/templates/custom/wait_count_train.tmpl @@ -1,4 +1,16 @@ -
- - {{.i18n.Tr "repo.wait_count_start"}}{{.WaitCount}}{{.i18n.Tr "repo.wait_count_end"}} -
\ No newline at end of file +
+ + {{.QueuesDetail}} + {{.i18n.Tr "repo.wait_count_start"}} + {{if .QueuesDetail}} + {{.QueuesDetail.a100}} + {{else}} + {{.WaitCount}} + {{ end }} + {{.i18n.Tr "repo.wait_count_end"}} +
diff --git a/web_src/js/features/cloudbrainShow.js b/web_src/js/features/cloudbrainShow.js index 3e556280f..b0f6f0ad7 100644 --- a/web_src/js/features/cloudbrainShow.js +++ b/web_src/js/features/cloudbrainShow.js @@ -161,7 +161,7 @@ export default async function initCloudrainSow() { // $(".content-pad").on("click", ".load-model-file", function () { console.log("11111111111"); - let version_name = $(this).data("version") || "result"; + let version_name = $(this).data("version"); let parents = $(this).data("parents") || ""; let filename = $(this).data("filename") || ""; let init = $(this).data("init") || ""; @@ -176,7 +176,11 @@ export default async function initCloudrainSow() { $(`input[name=modelback${version_name}]`).val(version_name); $(`#file_breadcrumb${version_name}`).empty(); let htmlBread = ""; - htmlBread += `
${version_name}
`; + if (version_name) { + htmlBread += `
${version_name}
`; + } else { + htmlBread += `
result
`; + } htmlBread += "
/
"; $(`#file_breadcrumb${version_name}`).append(htmlBread); } else { From c5dbae173137eaec3497fe2e261d526a8339553b Mon Sep 17 00:00:00 2001 From: zouap Date: Mon, 11 Jul 2022 17:00:16 +0800 Subject: [PATCH 348/424] =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E7=95=8C=E9=9D=A2=E4=BF=AE=E6=94=B9=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- routers/repo/ai_model_convert.go | 4 ++-- templates/repo/modelmanage/convertIndex.tmpl | 16 +++++++++++++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/routers/repo/ai_model_convert.go b/routers/repo/ai_model_convert.go index 5129d7eb7..b7ce6cbed 100644 --- a/routers/repo/ai_model_convert.go +++ b/routers/repo/ai_model_convert.go @@ -585,9 +585,8 @@ func ShowModelConvertInfo(ctx *context.Context) { func ConvertModelTemplate(ctx *context.Context) { ctx.Data["isModelManage"] = true - ctx.Data["MODEL_COUNT"] = 0 + SetModelCount(ctx) ctx.Data["ModelManageAccess"] = ctx.Repo.CanWrite(models.UnitTypeModelManage) - ctx.Data["TRAIN_COUNT"] = 0 ShowModelConvertPageInfo(ctx) ctx.HTML(200, tplModelManageConvertIndex) } @@ -620,6 +619,7 @@ func ShowModelConvertPageInfo(ctx *context.Context) { ctx.ServerError("Cloudbrain", err) return } + ctx.Data["MODEL_CONVERT_COUNT"] = 0 userIds := make([]int64, len(modelResult)) for i, model := range modelResult { model.IsCanOper = isOper(ctx, model.UserId) diff --git a/templates/repo/modelmanage/convertIndex.tmpl b/templates/repo/modelmanage/convertIndex.tmpl index ae680d775..3765b5961 100644 --- a/templates/repo/modelmanage/convertIndex.tmpl +++ b/templates/repo/modelmanage/convertIndex.tmpl @@ -40,7 +40,20 @@ {{$.i18n.Tr "repo.model.manage.create_new_convert_task"}}
- + {{if eq $.MODEL_CONVERT_COUNT 0}} +
+
+
未创建过模型转换任务
+
+ {{if eq $.MODEL_COUNT 0}} +
请您先导入模型,然后再对其进行转换。
+ {{end}} +
使用说明:可以参考启智AI协作平台小白训练营课程。
+ +
+
+ {{else}}
@@ -153,6 +166,7 @@
+ {{end}}
From 176dfff4c2d2cb9b3e6a732f56c7799ec8978a11 Mon Sep 17 00:00:00 2001 From: zouap Date: Mon, 11 Jul 2022 17:39:29 +0800 Subject: [PATCH 349/424] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=95=8C=E9=9D=A2Bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zouap --- templates/repo/grampus/trainjob/show.tmpl | 1 + templates/repo/modelmanage/index.tmpl | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/templates/repo/grampus/trainjob/show.tmpl b/templates/repo/grampus/trainjob/show.tmpl index a607221f9..3f3f39cfc 100755 --- a/templates/repo/grampus/trainjob/show.tmpl +++ b/templates/repo/grampus/trainjob/show.tmpl @@ -572,6 +572,7 @@