@@ -16,6 +16,7 @@ import ( | |||||
"fmt" | "fmt" | ||||
_ "image/jpeg" // Needed for jpeg support | _ "image/jpeg" // Needed for jpeg support | ||||
"image/png" | "image/png" | ||||
"math/rand" | |||||
"os" | "os" | ||||
"path/filepath" | "path/filepath" | ||||
"regexp" | "regexp" | ||||
@@ -495,7 +496,11 @@ func (u *User) RealSizedAvatarLink(size int) string { | |||||
// may either be a sub-URL to this site, or a full URL to an external avatar | // may either be a sub-URL to this site, or a full URL to an external avatar | ||||
// service. | // service. | ||||
func (u *User) RelAvatarLink() string { | func (u *User) RelAvatarLink() string { | ||||
return u.SizedRelAvatarLink(base.DefaultAvatarSize) | |||||
append := "" | |||||
if u.UseCustomAvatar { | |||||
append = "?" + fmt.Sprint(rand.Intn(100)) | |||||
} | |||||
return u.SizedRelAvatarLink(base.DefaultAvatarSize) + append | |||||
} | } | ||||
// AvatarLink returns user avatar absolute link. | // AvatarLink returns user avatar absolute link. | ||||
@@ -28,9 +28,9 @@ func ToCloudBrain(task *models.Cloudbrain) *api.Cloudbrain { | |||||
BootFile: task.BootFile, | BootFile: task.BootFile, | ||||
Description: task.Description, | Description: task.Description, | ||||
ModelName: task.ModelName, | ModelName: task.ModelName, | ||||
ModelVersion: task.ModelVersion, | |||||
CkptName: task.CkptName, | |||||
VersionName: task.VersionName, | |||||
ModelVersion: task.ModelVersion, | |||||
CkptName: task.CkptName, | |||||
StartTime: int64(task.StartTime), | StartTime: int64(task.StartTime), | ||||
EndTime: int64(task.EndTime), | EndTime: int64(task.EndTime), | ||||
@@ -51,33 +51,33 @@ type CreateFileNotebookJobOption struct { | |||||
} | } | ||||
type Cloudbrain struct { | type Cloudbrain struct { | ||||
ID int64 `json:"id"` | |||||
JobID string `json:"job_id"` | |||||
JobType string `json:"job_type"` | |||||
Type int `json:"type"` | |||||
DisplayJobName string `json:"display_job_name"` | |||||
Status string `json:"status"` | |||||
CreatedUnix int64 `json:"created_unix"` | |||||
RepoID int64 `json:"repo_id"` | |||||
Duration int64 `json:"duration"` //运行时长 单位秒 | |||||
TrainJobDuration string `json:"train_job_duration"` | |||||
ImageID string `json:"image_id"` //grampus image_id | |||||
Image string `json:"image"` | |||||
Uuid string `json:"uuid"` //数据集id | |||||
DatasetName string `json:"dataset_name"` | |||||
ComputeResource string `json:"compute_resource"` //计算资源,例如npu | |||||
AiCenter string `json:"ai_center"` //grampus ai center: center_id+center_name | |||||
BranchName string `json:"branch_name"` //分支名称 | |||||
Parameters string `json:"parameters"` //传给modelarts的param参数 | |||||
BootFile string `json:"boot_file"` //启动文件 | |||||
Description string `json:"description"` //描述 | |||||
ModelName string `json:"model_name"` //模型名称 | |||||
ModelVersion string `json:"model_version"` //模型版本 | |||||
CkptName string `json:"ckpt_name"` //权重文件名称 | |||||
StartTime int64 `json:"start_time"` | |||||
EndTime int64 `json:"end_time"` | |||||
Spec *SpecificationShow `json:"spec"` | |||||
ID int64 `json:"id"` | |||||
JobID string `json:"job_id"` | |||||
JobType string `json:"job_type"` | |||||
Type int `json:"type"` | |||||
DisplayJobName string `json:"display_job_name"` | |||||
Status string `json:"status"` | |||||
CreatedUnix int64 `json:"created_unix"` | |||||
RepoID int64 `json:"repo_id"` | |||||
Duration int64 `json:"duration"` //运行时长 单位秒 | |||||
TrainJobDuration string `json:"train_job_duration"` | |||||
ImageID string `json:"image_id"` //grampus image_id | |||||
Image string `json:"image"` | |||||
Uuid string `json:"uuid"` //数据集id | |||||
DatasetName string `json:"dataset_name"` | |||||
ComputeResource string `json:"compute_resource"` //计算资源,例如npu | |||||
AiCenter string `json:"ai_center"` //grampus ai center: center_id+center_name | |||||
BranchName string `json:"branch_name"` //分支名称 | |||||
Parameters string `json:"parameters"` //传给modelarts的param参数 | |||||
BootFile string `json:"boot_file"` //启动文件 | |||||
Description string `json:"description"` //描述 | |||||
ModelName string `json:"model_name"` //模型名称 | |||||
ModelVersion string `json:"model_version"` //模型版本 | |||||
CkptName string `json:"ckpt_name"` //权重文件名称 | |||||
StartTime int64 `json:"start_time"` | |||||
EndTime int64 `json:"end_time"` | |||||
VersionName string `json:"version_name"` | |||||
Spec *SpecificationShow `json:"spec"` | |||||
} | } | ||||
type SpecificationShow struct { | type SpecificationShow struct { | ||||
@@ -549,6 +549,8 @@ func RegisterRoutes(m *macaron.Macaron) { | |||||
}, reqToken()) | }, reqToken()) | ||||
m.Get("/compute-nodes", reqToken(), user.GetComputeNodes) | |||||
// Notifications | // Notifications | ||||
m.Group("/notifications", func() { | m.Group("/notifications", func() { | ||||
m.Combo(""). | m.Combo(""). | ||||
@@ -5,6 +5,7 @@ | |||||
package user | package user | ||||
import ( | import ( | ||||
"code.gitea.io/gitea/modules/modelarts" | |||||
"net/http" | "net/http" | ||||
"code.gitea.io/gitea/models" | "code.gitea.io/gitea/models" | ||||
@@ -146,3 +147,22 @@ func ListOrgRepos(ctx *context.APIContext) { | |||||
listUserRepos(ctx, ctx.Org.Organization, ctx.IsSigned) | listUserRepos(ctx, ctx.Org.Organization, ctx.IsSigned) | ||||
} | } | ||||
func GetComputeNodes(ctx *context.APIContext) { | |||||
taskeType := ctx.QueryInt("type") | |||||
if taskeType == 2 { | |||||
ctx.JSON(http.StatusOK, []int{1}) | |||||
} else { | |||||
modelarts.InitMultiNode() | |||||
if modelarts.MultiNodeConfig != nil { | |||||
for _, info := range modelarts.MultiNodeConfig.Info { | |||||
if isInOrg, _ := models.IsOrganizationMemberByOrgName(info.Org, ctx.User.ID); isInOrg { | |||||
ctx.JSON(http.StatusOK, info.Node) | |||||
return | |||||
} | |||||
} | |||||
} | |||||
ctx.JSON(http.StatusOK, []int{1}) | |||||
} | |||||
} |
@@ -1239,7 +1239,7 @@ func GrampusTrainJobShow(ctx *context.Context) { | |||||
return | return | ||||
} | } | ||||
task.ContainerIp = "" | task.ContainerIp = "" | ||||
task.User, _ = models.GetUserByID(task.UserID) | |||||
if task.DeletedAt.IsZero() { //normal record | if task.DeletedAt.IsZero() { //normal record | ||||
result, err := grampus.GetJob(task.JobID) | result, err := grampus.GetJob(task.JobID) | ||||
if err != nil { | if err != nil { | ||||
@@ -1250,6 +1250,7 @@ func RegisterRoutes(m *macaron.Macaron) { | |||||
m.Post("/stop", cloudbrain.AdminOrOwnerOrJobCreaterRightForTrain, repo.GrampusStopJob) | m.Post("/stop", cloudbrain.AdminOrOwnerOrJobCreaterRightForTrain, repo.GrampusStopJob) | ||||
m.Post("/del", cloudbrain.AdminOrOwnerOrJobCreaterRightForTrain, repo.GrampusTrainJobDel) | m.Post("/del", cloudbrain.AdminOrOwnerOrJobCreaterRightForTrain, repo.GrampusTrainJobDel) | ||||
m.Get("/model_download", cloudbrain.AdminOrJobCreaterRightForTrain, repo.ModelDownload) | m.Get("/model_download", cloudbrain.AdminOrJobCreaterRightForTrain, repo.ModelDownload) | ||||
m.Get("/download_multi_model", cloudbrain.AdminOrJobCreaterRightForTrain, repo.MultiModelDownload) | |||||
m.Get("/create_version", reqWechatBind, cloudbrain.AdminOrJobCreaterRightForTrain, repo.GrampusTrainJobVersionNew) | m.Get("/create_version", reqWechatBind, cloudbrain.AdminOrJobCreaterRightForTrain, repo.GrampusTrainJobVersionNew) | ||||
m.Post("/create_version", reqWechatBind, cloudbrain.AdminOrJobCreaterRightForTrain, bindIgnErr(auth.CreateGrampusTrainJobForm{}), repo.GrampusTrainJobVersionCreate) | m.Post("/create_version", reqWechatBind, cloudbrain.AdminOrJobCreaterRightForTrain, bindIgnErr(auth.CreateGrampusTrainJobForm{}), repo.GrampusTrainJobVersionCreate) | ||||
}) | }) | ||||
@@ -1335,6 +1336,7 @@ func RegisterRoutes(m *macaron.Macaron) { | |||||
m.Post("/stop", cloudbrain.AdminOrOwnerOrJobCreaterRightForTrain, repo.TrainJobStop) | m.Post("/stop", cloudbrain.AdminOrOwnerOrJobCreaterRightForTrain, repo.TrainJobStop) | ||||
m.Post("/del", cloudbrain.AdminOrOwnerOrJobCreaterRightForTrain, repo.TrainJobDel) | m.Post("/del", cloudbrain.AdminOrOwnerOrJobCreaterRightForTrain, repo.TrainJobDel) | ||||
m.Get("/model_download", cloudbrain.AdminOrJobCreaterRightForTrain, repo.ModelDownload) | m.Get("/model_download", cloudbrain.AdminOrJobCreaterRightForTrain, repo.ModelDownload) | ||||
m.Get("/download_multi_model", cloudbrain.AdminOrJobCreaterRightForTrain, repo.MultiModelDownload) | |||||
m.Get("/download_log_file", cloudbrain.AdminOrJobCreaterRightForTrain, repo.TrainJobDownloadLogFile) | m.Get("/download_log_file", cloudbrain.AdminOrJobCreaterRightForTrain, repo.TrainJobDownloadLogFile) | ||||
m.Get("/create_version", reqWechatBind, cloudbrain.AdminOrJobCreaterRightForTrain, context.PointAccount(), repo.TrainJobNewVersion) | m.Get("/create_version", reqWechatBind, cloudbrain.AdminOrJobCreaterRightForTrain, context.PointAccount(), repo.TrainJobNewVersion) | ||||
m.Post("/create_version", reqWechatBind, cloudbrain.AdminOrJobCreaterRightForTrain, bindIgnErr(auth.CreateModelArtsTrainJobForm{}), repo.TrainJobCreateVersion) | m.Post("/create_version", reqWechatBind, cloudbrain.AdminOrJobCreaterRightForTrain, bindIgnErr(auth.CreateModelArtsTrainJobForm{}), repo.TrainJobCreateVersion) | ||||
@@ -412,9 +412,9 @@ | |||||
<input type="hidden" name="model{{.VersionName}}" value="-1"> | <input type="hidden" name="model{{.VersionName}}" value="-1"> | ||||
<input type="hidden" name="modelback{{.VersionName}}" value="-1"> | <input type="hidden" name="modelback{{.VersionName}}" value="-1"> | ||||
<div class='ui breadcrumb model_file_bread' id='file_breadcrumb{{.VersionName}}'> | <div class='ui breadcrumb model_file_bread' id='file_breadcrumb{{.VersionName}}'> | ||||
<div class="active section">{{.VersionName}}</div> | |||||
<div class="divider"> / </div> | |||||
<div class="active section">{{.VersionName}}</div> | |||||
<div class="divider"> / </div> | |||||
</div> | </div> | ||||
<div id="dir_list{{.VersionName}}" style="max-height: 500px;overflow:auto;"> | <div id="dir_list{{.VersionName}}" style="max-height: 500px;overflow:auto;"> | ||||