@@ -205,7 +205,7 @@ type Cloudbrain struct { | |||
BenchmarkTypeRankLink string `xorm:"-"` | |||
StartTime timeutil.TimeStamp | |||
EndTime timeutil.TimeStamp | |||
Cleared bool `xorm:"DEFAULT false"` | |||
Cleared bool `xorm:"DEFAULT false"` | |||
Spec *Specification `xorm:"-"` | |||
} | |||
@@ -1823,7 +1823,7 @@ func QueryModelTrainJobVersionList(jobId string) ([]*Cloudbrain, int, error) { | |||
return cloudbrains, int(len(cloudbrains)), nil | |||
} | |||
func QueryModelTrainJobList(repoId int64) ([]*CloudbrainInfo, int, error) { | |||
func QueryModelTrainJobList(repoId int64) ([]*Cloudbrain, int, error) { | |||
sess := x.NewSession() | |||
defer sess.Close() | |||
var cond = builder.NewCond() | |||
@@ -1840,14 +1840,14 @@ func QueryModelTrainJobList(repoId int64) ([]*CloudbrainInfo, int, error) { | |||
// builder.In("type", 0, 1), | |||
// ) | |||
cloudbrains := make([]*CloudbrainInfo, 0) | |||
cloudbrains := make([]*Cloudbrain, 0) | |||
if err := sess.Select("job_id,display_job_name").Table(&Cloudbrain{}).Where(cond).OrderBy("created_unix DESC"). | |||
Find(&cloudbrains); err != nil { | |||
return nil, 0, fmt.Errorf("Find: %v", err) | |||
} | |||
keys := make(map[string]string) | |||
uniqueElements := make([]*CloudbrainInfo, 0) | |||
uniqueElements := make([]*Cloudbrain, 0) | |||
for _, entry := range cloudbrains { | |||
if _, value := keys[entry.JobID]; !value { | |||
keys[entry.JobID] = entry.DisplayJobName | |||
@@ -1988,7 +1988,7 @@ func GetCloudbrainByID(id string) (*Cloudbrain, error) { | |||
return getRepoCloudBrain(cb) | |||
} | |||
func IsCloudbrainExistByJobName(jobName string)(bool,error){ | |||
func IsCloudbrainExistByJobName(jobName string) (bool, error) { | |||
return x.Unscoped().Exist(&Cloudbrain{ | |||
JobName: jobName, | |||
}) | |||
@@ -2181,25 +2181,25 @@ func GetCloudBrainOneStoppedNotDebugJobDaysAgo(days int, limit int) ([]*Cloudbra | |||
Limit(limit). | |||
Find(&cloudbrains) | |||
} | |||
/** | |||
本方法考虑了再次调试的情况,多次调试取最后一次的任务的结束时间 | |||
*/ | |||
*/ | |||
func GetCloudBrainOneStoppedDebugJobDaysAgo(days int, limit int) ([]*Cloudbrain, error) { | |||
cloudbrains := make([]*Cloudbrain, 0, 10) | |||
endTimeBefore := time.Now().Unix() - int64(days)*24*3600 | |||
missEndTimeBefore := endTimeBefore - 24*3600 | |||
sql:=`SELECT id,job_name,job_id from (SELECT DISTINCT ON (job_name) | |||
sql := `SELECT id,job_name,job_id from (SELECT DISTINCT ON (job_name) | |||
id, job_name, job_id,status,end_time,updated_unix,cleared | |||
FROM cloudbrain | |||
where type=0 and job_type='DEBUG' | |||
ORDER BY job_name, updated_unix DESC) a | |||
where status in ('STOPPED','SUCCEEDED','FAILED') and (((end_time is null or end_time=0) and updated_unix<? and updated_unix != 0 ) or (end_time<? and end_time != 0)) and cleared=false` | |||
return cloudbrains, x.Unscoped().SQL(sql,missEndTimeBefore, endTimeBefore).Limit(limit).Find(&cloudbrains) | |||
return cloudbrains, x.Unscoped().SQL(sql, missEndTimeBefore, endTimeBefore).Limit(limit).Find(&cloudbrains) | |||
} | |||
func UpdateCloudBrainRecordsCleared(ids []int64) error { | |||
pageSize := 150 | |||
n := len(ids) / pageSize | |||
@@ -34,8 +34,7 @@ func ToCloudBrain(task *models.Cloudbrain) *api.Cloudbrain { | |||
StartTime: int64(task.StartTime), | |||
EndTime: int64(task.EndTime), | |||
Spec: ToSpecification(task.Spec), | |||
Spec: ToSpecification(task.Spec), | |||
} | |||
} | |||
func ToAttachment(attachment *models.Attachment) *api.AttachmentShow { | |||
@@ -89,6 +88,9 @@ func ToDataset(dataset *models.Dataset) *api.Dataset { | |||
} | |||
func ToSpecification(s *models.Specification) *api.SpecificationShow { | |||
if s == nil { | |||
return nil | |||
} | |||
return &api.SpecificationShow{ | |||
ID: s.ID, | |||
AccCardsNum: s.AccCardsNum, | |||
@@ -577,6 +577,7 @@ static.CloudBrainTaskNum=CloudBrain Task Count | |||
static.CloudBrainRunTime=CloudBrain Run Time | |||
static.CommitDatasetNum=Commit Dataset Count | |||
static.CommitModelCount=Commit Model Count | |||
static.ModelConvertCount=Model Convert Count | |||
static.UserIndex=Normalized user index | |||
static.UserIndexPrimitive=User Index | |||
static.countdate=Count Date | |||
@@ -581,6 +581,7 @@ static.CloudBrainTaskNum=云脑任务数 | |||
static.CloudBrainRunTime=云脑运行时间(小时) | |||
static.CommitDatasetNum=上传(提交)数据集文件数 | |||
static.CommitModelCount=提交模型数 | |||
static.ModelConvertCount=模型转换数 | |||
static.UserIndex=归一化用户指数 | |||
static.UserIndexPrimitive=用户指数 | |||
static.countdate=系统统计时间 | |||
@@ -1672,7 +1673,7 @@ issues.action_assignee_no_select=未指派 | |||
issues.opened_by=由 <a href="%[2]s">%[3]s</a> 于 %[1]s创建 | |||
pulls.merged_by=由 <a href="%[2]s">%[3]s</a> 于 %[1]s 合并 | |||
pulls.merged_by_fake=由 %[2]s 于 %[1]s 合并 | |||
issues.closed_by=按 <a href="%[2]s">%[3]s</a> 关闭%[1]s | |||
issues.closed_by=由 <a href="%[2]s">%[3]s</a> 创建,被关闭于 %[1]s | |||
issues.opened_by_fake=由 %[2]s 于 %[1]s创建 | |||
issues.closed_by_fake=通过 %[2]s 关闭 %[1]s | |||
issues.previous=上一页 | |||
@@ -1024,6 +1024,8 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
m.Get("/query_model_byName", repo.QueryModelByName) | |||
m.Get("/query_model_for_predict", repo.QueryModelListForPredict) | |||
m.Get("/query_modelfile_for_predict", repo.QueryModelFileForPredict) | |||
m.Get("/query_train_job", repo.QueryTrainJobList) | |||
m.Get("/query_train_job_version", repo.QueryTrainJobVersionList) | |||
m.Get("/query_train_model", repo.QueryTrainModelList) | |||
m.Post("/create_model_convert", repo.CreateModelConvert) | |||
m.Post("/convert_stop", repo.StopModelConvert) | |||
@@ -4,8 +4,10 @@ import ( | |||
"net/http" | |||
"code.gitea.io/gitea/modules/context" | |||
"code.gitea.io/gitea/modules/convert" | |||
"code.gitea.io/gitea/modules/log" | |||
"code.gitea.io/gitea/modules/storage" | |||
api "code.gitea.io/gitea/modules/structs" | |||
routerRepo "code.gitea.io/gitea/routers/repo" | |||
) | |||
@@ -54,6 +56,21 @@ func QueryModelListForPredict(ctx *context.APIContext) { | |||
routerRepo.QueryModelListForPredict(ctx.Context) | |||
} | |||
func QueryTrainJobList(ctx *context.APIContext) { | |||
result, err := routerRepo.QueryTrainJobListApi(ctx.Context) | |||
if err != nil { | |||
log.Info("query error." + err.Error()) | |||
ctx.JSON(http.StatusOK, nil) | |||
} else { | |||
re := make([]*api.Cloudbrain, 0) | |||
for _, task := range result { | |||
conRe := convert.ToCloudBrain(task) | |||
re = append(re, conRe) | |||
} | |||
ctx.JSON(http.StatusOK, re) | |||
} | |||
} | |||
func QueryTrainModelList(ctx *context.APIContext) { | |||
result, err := routerRepo.QueryTrainModelFileById(ctx.Context) | |||
if err != nil { | |||
@@ -63,6 +80,21 @@ func QueryTrainModelList(ctx *context.APIContext) { | |||
ctx.JSON(http.StatusOK, re) | |||
} | |||
func QueryTrainJobVersionList(ctx *context.APIContext) { | |||
result, err := routerRepo.QueryTrainJobVersionListApi(ctx.Context) | |||
if err != nil { | |||
log.Info("query error." + err.Error()) | |||
ctx.JSON(http.StatusOK, nil) | |||
} else { | |||
re := make([]*api.Cloudbrain, 0) | |||
for _, task := range result { | |||
conRe := convert.ToCloudBrain(task) | |||
re = append(re, conRe) | |||
} | |||
ctx.JSON(http.StatusOK, re) | |||
} | |||
} | |||
func convertFileFormat(result []storage.FileInfo) []FileInfo { | |||
re := make([]FileInfo, 0) | |||
if result != nil { | |||
@@ -2,7 +2,6 @@ package repo | |||
import ( | |||
"archive/zip" | |||
"code.gitea.io/gitea/services/repository" | |||
"encoding/json" | |||
"errors" | |||
"fmt" | |||
@@ -12,6 +11,8 @@ import ( | |||
"regexp" | |||
"strings" | |||
"code.gitea.io/gitea/services/repository" | |||
"code.gitea.io/gitea/models" | |||
"code.gitea.io/gitea/modules/context" | |||
"code.gitea.io/gitea/modules/log" | |||
@@ -710,36 +711,42 @@ func downloadFromCloudBrainTwo(path string, task *models.AiModelManage, ctx *con | |||
} | |||
func QueryTrainJobVersionList(ctx *context.Context) { | |||
VersionListTasks, err := QueryTrainJobVersionListApi(ctx) | |||
if err != nil { | |||
ctx.JSON(200, nil) | |||
} else { | |||
ctx.JSON(200, VersionListTasks) | |||
} | |||
} | |||
func QueryTrainJobVersionListApi(ctx *context.Context) ([]*models.Cloudbrain, error) { | |||
log.Info("query train job version list. start.") | |||
JobID := ctx.Query("jobId") | |||
if JobID == "" { | |||
JobID = ctx.Query("JobId") | |||
} | |||
VersionListTasks, count, err := models.QueryModelTrainJobVersionList(JobID) | |||
log.Info("query return count=" + fmt.Sprint(count)) | |||
return VersionListTasks, err | |||
} | |||
func QueryTrainJobList(ctx *context.Context) { | |||
VersionListTasks, err := QueryTrainJobListApi(ctx) | |||
if err != nil { | |||
ctx.ServerError("QueryTrainJobList:", err) | |||
ctx.JSON(200, nil) | |||
} else { | |||
ctx.JSON(200, VersionListTasks) | |||
} | |||
} | |||
func QueryTrainJobList(ctx *context.Context) { | |||
log.Info("query train job list. start.") | |||
func QueryTrainJobListApi(ctx *context.Context) ([]*models.Cloudbrain, error) { | |||
repoId := ctx.QueryInt64("repoId") | |||
VersionListTasks, count, err := models.QueryModelTrainJobList(repoId) | |||
log.Info("query return count=" + fmt.Sprint(count)) | |||
if err != nil { | |||
ctx.ServerError("QueryTrainJobList:", err) | |||
} else { | |||
ctx.JSON(200, VersionListTasks) | |||
} | |||
return VersionListTasks, err | |||
} | |||
func QueryTrainModelFileById(ctx *context.Context) ([]storage.FileInfo, error) { | |||
@@ -1641,6 +1641,21 @@ func CloudBrainDownloadModel(ctx *context.Context) { | |||
ctx.Resp.Header().Set("Cache-Control", "max-age=0") | |||
http.Redirect(ctx.Resp, ctx.Req.Request, url, http.StatusMovedPermanently) | |||
} | |||
func CloudBrainDownloadMultiModel(ctx *context.Context) { | |||
parentDir := ctx.Query("parentDir") | |||
jobName := ctx.Query("jobName") | |||
filePath := "jobs/" + jobName + "/model/" + parentDir | |||
allFile, err := storage.GetAllObjectByBucketAndPrefixMinio(setting.Attachment.Minio.Bucket, filePath) | |||
if err == nil { | |||
returnFileName := jobName + ".zip" | |||
MinioDownloadManyFile(filePath, ctx, returnFileName, allFile) | |||
} else { | |||
log.Info("error,msg=" + err.Error()) | |||
ctx.ServerError("no file to download.", err) | |||
} | |||
} | |||
func CloudBrainDownloadInferenceResult(ctx *context.Context) { | |||
parentDir := ctx.Query("parentDir") | |||
fileName := ctx.Query("fileName") | |||
@@ -2657,6 +2657,44 @@ func InferenceJobShow(ctx *context.Context) { | |||
ctx.HTML(http.StatusOK, tplModelArtsInferenceJobShow) | |||
} | |||
func MultiModelDownload(ctx *context.Context) { | |||
var ( | |||
err error | |||
) | |||
jobID := ctx.Params(":jobid") | |||
versionName := ctx.Query("version_name") | |||
parentDir := ctx.Query("parent_dir") | |||
task, err := models.GetCloudbrainByJobIDAndVersionName(jobID, versionName) | |||
if err != nil { | |||
log.Error("GetCloudbrainByJobIDAndVersionName(%s) failed:%v", task.JobName, err.Error()) | |||
return | |||
} | |||
if task.ComputeResource == models.NPUResource { | |||
path := strings.TrimPrefix(path.Join(setting.TrainJobModelPath, task.JobName, setting.OutPutPath, versionName, parentDir), "/") | |||
allFile, err := storage.GetAllObjectByBucketAndPrefix(setting.Bucket, path) | |||
if err == nil { | |||
returnFileName := task.DisplayJobName + ".zip" | |||
ObsDownloadManyFile(path, ctx, returnFileName, allFile) | |||
} else { | |||
log.Info("error,msg=" + err.Error()) | |||
ctx.ServerError("no file to download.", err) | |||
} | |||
} else if task.ComputeResource == models.GPUResource { | |||
filePath := setting.CBCodePathPrefix + task.JobName + cloudbrain.ModelMountPath + "/" + parentDir | |||
allFile, err := storage.GetAllObjectByBucketAndPrefixMinio(setting.Attachment.Minio.Bucket, filePath) | |||
if err == nil { | |||
returnFileName := task.DisplayJobName + ".zip" | |||
MinioDownloadManyFile(filePath, ctx, returnFileName, allFile) | |||
} else { | |||
log.Info("error,msg=" + err.Error()) | |||
ctx.ServerError("no file to download.", err) | |||
} | |||
} | |||
} | |||
func ModelDownload(ctx *context.Context) { | |||
var ( | |||
err error | |||
@@ -1186,6 +1186,7 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
m.Get("/rate", reqRepoCloudBrainReader, repo.GetRate) | |||
m.Get("/models", reqRepoCloudBrainReader, repo.CloudBrainShowModels) | |||
m.Get("/download_model", cloudbrain.AdminOrJobCreaterRight, repo.CloudBrainDownloadModel) | |||
m.Get("/download_multi_model", cloudbrain.AdminOrJobCreaterRight, repo.CloudBrainDownloadMultiModel) | |||
}) | |||
m.Get("/create", reqWechatBind, reqRepoCloudBrainWriter, context.PointAccount(), repo.CloudBrainNew) | |||
m.Post("/create", reqWechatBind, reqRepoCloudBrainWriter, bindIgnErr(auth.CreateCloudBrainForm{}), repo.CloudBrainCreate) | |||
@@ -1209,6 +1210,7 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
m.Post("/del", cloudbrain.AdminOrOwnerOrJobCreaterRightForTrain, repo.CloudBrainTrainJobDel) | |||
//m.Get("/models", reqRepoCloudBrainReader, repo.CloudBrainShowModels) | |||
m.Get("/download_model", cloudbrain.AdminOrOwnerOrJobCreaterRightForTrain, repo.CloudBrainDownloadModel) | |||
m.Get("/download_multi_model", cloudbrain.AdminOrJobCreaterRight, repo.CloudBrainDownloadMultiModel) | |||
//m.Get("/get_log", cloudbrain.AdminOrJobCreaterRightForTrain, repo.GetLogFromModelDir) | |||
//m.Post("/create_version", reqWechatBind, cloudbrain.AdminOrJobCreaterRightForTrain, bindIgnErr(auth.CreateModelArtsTrainJobForm{}), repo.TrainJobCreateVersion) | |||
m.Get("/create_version", reqWechatBind, cloudbrain.AdminOrJobCreaterRightForTrain, repo.CloudBrainTrainJobVersionNew) | |||
@@ -1221,7 +1223,7 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
m.Group("/:jobid", func() { | |||
m.Get("", reqRepoCloudBrainReader, repo.InferenceCloudBrainJobShow) | |||
m.Get("/result_download", cloudbrain.AdminOrJobCreaterRightForTrain, repo.CloudBrainDownloadInferenceResult) | |||
m.Get("/download_multi_model", cloudbrain.AdminOrJobCreaterRight, repo.CloudBrainDownloadMultiModel) | |||
m.Get("/downloadall", repo.DownloadInferenceResultFile) | |||
}) | |||
m.Get("/create", reqWechatBind, reqRepoCloudBrainWriter, context.PointAccount(), repo.InferenceCloudBrainJobNew) | |||