You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

cloudbrains.go 8.1 kB

2 years ago
2 years ago
3 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. package admin
  2. import (
  3. "net/http"
  4. "net/url"
  5. "strconv"
  6. "strings"
  7. "time"
  8. "github.com/360EntSecGroup-Skylar/excelize/v2"
  9. "code.gitea.io/gitea/modules/modelarts"
  10. "code.gitea.io/gitea/routers/repo"
  11. "code.gitea.io/gitea/models"
  12. "code.gitea.io/gitea/modules/base"
  13. "code.gitea.io/gitea/modules/context"
  14. "code.gitea.io/gitea/modules/log"
  15. "code.gitea.io/gitea/modules/setting"
  16. cloudbrainService "code.gitea.io/gitea/services/cloudbrain"
  17. )
  18. const (
  19. tplCloudBrains base.TplName = "admin/cloudbrain/list"
  20. tplImages base.TplName = "admin/cloudbrain/images"
  21. tplCommitImages base.TplName = "admin/cloudbrain/imagecommit"
  22. EXCEL_DATE_FORMAT = "20060102150405"
  23. CREATE_TIME_FORMAT = "2006/01/02 15:04:05"
  24. )
  25. func CloudBrains(ctx *context.Context) {
  26. ctx.Data["Title"] = ctx.Tr("admin.cloudBrains")
  27. ctx.Data["PageIsAdmin"] = true
  28. ctx.Data["PageIsAdminCloudBrains"] = true
  29. listType := ctx.Query("listType")
  30. jobType := ctx.Query("jobType")
  31. jobStatus := ctx.Query("jobStatus")
  32. aiCenter := ctx.Query("aiCenter")
  33. cluster := ctx.Query("cluster")
  34. ctx.Data["ListType"] = listType
  35. ctx.Data["JobType"] = jobType
  36. ctx.Data["JobStatus"] = jobStatus
  37. ctx.Data["aiCenter"] = aiCenter
  38. ctx.Data["cluster"] = cluster
  39. page := ctx.QueryInt("page")
  40. if page <= 0 {
  41. page = 1
  42. }
  43. var jobTypes []string
  44. jobTypeNot := false
  45. if jobType == string(models.JobTypeBenchmark) {
  46. jobTypes = append(jobTypes, string(models.JobTypeBenchmark), string(models.JobTypeModelSafety), string(models.JobTypeBrainScore), string(models.JobTypeSnn4imagenet), string(models.JobTypeSnn4Ecoset))
  47. } else if jobType != "all" && jobType != "" {
  48. jobTypes = append(jobTypes, jobType)
  49. }
  50. var jobStatuses []string
  51. jobStatusNot := false
  52. if jobStatus == "other" {
  53. jobStatusNot = true
  54. jobStatuses = append(jobStatuses, string(models.ModelArtsTrainJobWaiting), string(models.ModelArtsTrainJobFailed), string(models.ModelArtsRunning), string(models.ModelArtsTrainJobCompleted),
  55. string(models.ModelArtsStarting), string(models.ModelArtsRestarting), string(models.ModelArtsStartFailed),
  56. string(models.ModelArtsStopping), string(models.ModelArtsStopped), string(models.JobSucceeded))
  57. } else if jobStatus != "all" && jobStatus != "" {
  58. jobStatuses = append(jobStatuses, jobStatus)
  59. }
  60. keyword := strings.Trim(ctx.Query("q"), " ")
  61. ciTasks, count, err := models.Cloudbrains(&models.CloudbrainsOptions{
  62. ListOptions: models.ListOptions{
  63. Page: page,
  64. PageSize: setting.UI.IssuePagingNum,
  65. },
  66. Keyword: keyword,
  67. JobTypeNot: jobTypeNot,
  68. JobStatusNot: jobStatusNot,
  69. JobStatus: jobStatuses,
  70. JobTypes: jobTypes,
  71. NeedRepoInfo: true,
  72. IsLatestVersion: modelarts.IsLatestVersion,
  73. ComputeResource: listType,
  74. Type: models.TypeCloudBrainAll,
  75. AiCenter: aiCenter,
  76. Cluster: cluster,
  77. })
  78. if err != nil {
  79. ctx.ServerError("Get job failed:", err)
  80. return
  81. }
  82. models.LoadSpecs4CloudbrainInfo(ciTasks)
  83. for i, task := range ciTasks {
  84. ciTasks[i] = cloudbrainService.UpdateCloudbrainAiCenter(ciTasks[i])
  85. ciTasks[i].Cloudbrain.AiCenter = repo.GetAiCenterNameByCode(ciTasks[i].Cloudbrain.AiCenter, ctx.Language())
  86. ciTasks[i].CanDebug = true
  87. ciTasks[i].CanDel = true
  88. ciTasks[i].Cloudbrain.ComputeResource = task.ComputeResource
  89. if ciTasks[i].Cloudbrain.Spec != nil {
  90. if ciTasks[i].Cloudbrain.Type == models.TypeC2Net {
  91. ciTasks[i].Cloudbrain.Spec.Cluster = models.C2NetCluster
  92. } else {
  93. ciTasks[i].Cloudbrain.Spec.Cluster = models.OpenICluster
  94. }
  95. }
  96. }
  97. pager := context.NewPagination(int(count), setting.UI.IssuePagingNum, page, getTotalPage(count, setting.UI.IssuePagingNum))
  98. pager.SetDefaultParams(ctx)
  99. pager.AddParam(ctx, "listType", "ListType")
  100. ctx.Data["Page"] = pager
  101. ctx.Data["PageIsCloudBrain"] = true
  102. ctx.Data["Tasks"] = ciTasks
  103. ctx.Data["CanCreate"] = true
  104. ctx.Data["Keyword"] = keyword
  105. ctx.HTML(200, tplCloudBrains)
  106. }
  107. func Images(ctx *context.Context) {
  108. ctx.Data["PageIsAdminImages"] = true
  109. ctx.HTML(200, tplImages)
  110. }
  111. func CloudBrainCommitImageShow(ctx *context.Context) {
  112. ctx.Data["PageIsAdminImages"] = true
  113. ctx.HTML(200, tplCommitImages)
  114. }
  115. func DownloadCloudBrains(ctx *context.Context) {
  116. page := 1
  117. pageSize := 300
  118. var cloudBrain = ctx.Tr("repo.cloudbrain")
  119. fileName := getFileName(cloudBrain)
  120. _, total, err := models.Cloudbrains(&models.CloudbrainsOptions{
  121. ListOptions: models.ListOptions{
  122. Page: page,
  123. PageSize: 1,
  124. },
  125. Type: models.TypeCloudBrainAll,
  126. NeedRepoInfo: false,
  127. IsLatestVersion: modelarts.IsLatestVersion,
  128. })
  129. if err != nil {
  130. log.Warn("Can not get cloud brain info", err)
  131. ctx.Error(http.StatusBadRequest, ctx.Tr("repo.cloudbrain_query_fail"))
  132. return
  133. }
  134. totalPage := getTotalPage(total, pageSize)
  135. f := excelize.NewFile()
  136. index := f.NewSheet(cloudBrain)
  137. f.DeleteSheet("Sheet1")
  138. for k, v := range allHeader(ctx) {
  139. f.SetCellValue(cloudBrain, k, v)
  140. }
  141. var row = 2
  142. for i := 0; i < totalPage; i++ {
  143. pageRecords, _, err := models.Cloudbrains(&models.CloudbrainsOptions{
  144. ListOptions: models.ListOptions{
  145. Page: page,
  146. PageSize: pageSize,
  147. },
  148. Type: models.TypeCloudBrainAll,
  149. NeedRepoInfo: true,
  150. IsLatestVersion: modelarts.IsLatestVersion,
  151. })
  152. if err != nil {
  153. log.Warn("Can not get cloud brain info", err)
  154. continue
  155. }
  156. models.LoadSpecs4CloudbrainInfo(pageRecords)
  157. for _, record := range pageRecords {
  158. record = cloudbrainService.UpdateCloudbrainAiCenter(record)
  159. record.Cloudbrain.AiCenter = repo.GetAiCenterNameByCode(record.Cloudbrain.AiCenter, ctx.Language())
  160. for k, v := range allValues(row, record, ctx) {
  161. f.SetCellValue(cloudBrain, k, v)
  162. }
  163. row++
  164. }
  165. page++
  166. }
  167. f.SetActiveSheet(index)
  168. ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+url.QueryEscape(fileName))
  169. ctx.Resp.Header().Set("Content-Type", "application/octet-stream")
  170. f.WriteTo(ctx.Resp)
  171. }
  172. func allValues(row int, rs *models.CloudbrainInfo, ctx *context.Context) map[string]string {
  173. return map[string]string{getCellName("A", row): rs.DisplayJobName, getCellName("B", row): repo.GetCloudbrainCluster(rs.Cloudbrain, ctx),
  174. getCellName("C", row): rs.JobType, getCellName("D", row): rs.Status, getCellName("E", row): time.Unix(int64(rs.Cloudbrain.CreatedUnix), 0).Format(CREATE_TIME_FORMAT),
  175. getCellName("F", row): getDurationTime(rs), getCellName("G", row): rs.ComputeResource,
  176. getCellName("H", row): rs.Cloudbrain.AiCenter, getCellName("I", row): getCloudbrainCardType(rs),
  177. getCellName("J", row): rs.Name, getCellName("K", row): getRepoPathName(rs), getCellName("L", row): rs.JobName,
  178. }
  179. }
  180. func getCloudbrainCardType(rs *models.CloudbrainInfo) string {
  181. if rs.Cloudbrain.Spec != nil {
  182. return rs.Cloudbrain.Spec.AccCardType
  183. } else {
  184. return ""
  185. }
  186. }
  187. func getRepoPathName(rs *models.CloudbrainInfo) string {
  188. if rs.Repo != nil {
  189. return rs.Repo.OwnerName + "/" + rs.Repo.Alias
  190. }
  191. return ""
  192. }
  193. func getDurationTime(rs *models.CloudbrainInfo) string {
  194. if rs.JobType == "TRAIN" || rs.JobType == "INFERENCE" {
  195. return rs.TrainJobDuration
  196. } else {
  197. return "-"
  198. }
  199. }
  200. func getFileName(baseName string) string {
  201. return baseName + "_" + time.Now().Format(EXCEL_DATE_FORMAT) + ".xlsx"
  202. }
  203. func getTotalPage(total int64, pageSize int) int {
  204. another := 0
  205. if int(total)%pageSize != 0 {
  206. another = 1
  207. }
  208. return int(total)/pageSize + another
  209. }
  210. func allHeader(ctx *context.Context) map[string]string {
  211. return map[string]string{"A1": ctx.Tr("repo.cloudbrain_task"), "B1": ctx.Tr("repo.modelarts.cluster"),
  212. "C1": ctx.Tr("repo.cloudbrain_task_type"), "D1": ctx.Tr("repo.modelarts.status"), "E1": ctx.Tr("repo.modelarts.createtime"),
  213. "F1": ctx.Tr("repo.modelarts.train_job.dura_time"), "G1": ctx.Tr("repo.modelarts.computing_resources"),
  214. "H1": ctx.Tr("repo.modelarts.ai_center"), "I1": ctx.Tr("repo.modelarts.card_type"), "J1": ctx.Tr("repo.cloudbrain_creator"),
  215. "K1": ctx.Tr("repo.repo_name"), "L1": ctx.Tr("repo.cloudbrain_task_name")}
  216. }
  217. func getCellName(col string, row int) string {
  218. return col + strconv.Itoa(row)
  219. }