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.

ai_model_manage.go 5.0 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package repo
  2. import (
  3. "errors"
  4. "fmt"
  5. "path"
  6. "strings"
  7. "code.gitea.io/gitea/models"
  8. "code.gitea.io/gitea/modules/context"
  9. "code.gitea.io/gitea/modules/log"
  10. "code.gitea.io/gitea/modules/setting"
  11. "code.gitea.io/gitea/modules/storage"
  12. uuid "github.com/satori/go.uuid"
  13. )
  14. func SaveModelByParameters(jobId string, name string, version string, label string, description string, userId int64) error {
  15. aiTask, err := models.GetCloudbrainByJobID(jobId)
  16. if err != nil {
  17. log.Info("query task error." + err.Error())
  18. return err
  19. }
  20. uuid := uuid.NewV4()
  21. id := uuid.String()
  22. modelPath := id
  23. parent := id
  24. var modelSize int64
  25. cloudType := models.TypeCloudBrainTwo
  26. log.Info("find task name:" + aiTask.JobName)
  27. aimodels := models.QueryModelByName(name, userId)
  28. if len(aimodels) > 0 {
  29. for _, model := range aimodels {
  30. if model.ID == model.Parent {
  31. parent = model.ID
  32. }
  33. }
  34. }
  35. cloudType = aiTask.Type
  36. //download model zip //train type
  37. if cloudType == models.TypeCloudBrainTwo {
  38. modelPath, modelSize, err = downloadModelFromCloudBrainTwo(id, aiTask.JobName, "")
  39. if err != nil {
  40. log.Info("download model from CloudBrainTwo faild." + err.Error())
  41. return err
  42. }
  43. }
  44. model := &models.AiModelManage{
  45. ID: id,
  46. Version: version,
  47. Label: label,
  48. Name: name,
  49. Description: description,
  50. Parent: parent,
  51. Type: cloudType,
  52. Path: modelPath,
  53. Size: modelSize,
  54. AttachmentId: aiTask.Uuid,
  55. RepoId: aiTask.RepoID,
  56. UserId: userId,
  57. }
  58. models.SaveModelToDb(model)
  59. log.Info("save model end.")
  60. return nil
  61. }
  62. func SaveModel(ctx *context.Context) {
  63. log.Info("save model start.")
  64. JobId := ctx.Query("JobId")
  65. name := ctx.Query("Name")
  66. version := ctx.Query("Version")
  67. label := ctx.Query("Label")
  68. description := ctx.Query("Description")
  69. err := SaveModelByParameters(JobId, name, version, label, description, ctx.User.ID)
  70. if err != nil {
  71. log.Info("save model error." + err.Error())
  72. ctx.Error(500, fmt.Sprintf("save model error. %v", err))
  73. return
  74. }
  75. log.Info("save model end.")
  76. }
  77. func downloadModelFromCloudBrainTwo(modelUUID string, jobName string, parentDir string) (string, int64, error) {
  78. dataActualPath := setting.Bucket + "/" +
  79. "aimodels/" +
  80. models.AttachmentRelativePath(modelUUID) +
  81. "/"
  82. modelDbResult, err := storage.GetObsListObject(jobName, parentDir)
  83. if err != nil {
  84. log.Info("get TrainJobListModel failed:", err)
  85. return "", 0, err
  86. }
  87. if len(modelDbResult) == 0 {
  88. return "", 0, errors.New("cannot create model, as model is empty.")
  89. }
  90. var size int64
  91. prefix := strings.TrimPrefix(path.Join(setting.TrainJobModelPath, jobName, setting.OutPutPath, parentDir), "/") + "/"
  92. for _, modelFile := range modelDbResult {
  93. destKeyNamePrefix := "aimodels/" + models.AttachmentRelativePath(modelUUID) + "/"
  94. log.Info("copy file, bucket=" + setting.Bucket + ", src keyname=" + prefix + modelFile.FileName)
  95. log.Info("Dest key name=" + destKeyNamePrefix + modelFile.FileName)
  96. err := storage.ObsCopyFile(setting.Bucket, prefix+modelFile.FileName, setting.Bucket, destKeyNamePrefix+modelFile.FileName)
  97. if err != nil {
  98. log.Info("copy failed.")
  99. }
  100. size += modelFile.Size
  101. }
  102. return dataActualPath, size, nil
  103. }
  104. func DeleteModel(ctx *context.Context) {
  105. log.Info("delete model start.")
  106. id := ctx.Query("ID")
  107. err := DeleteModelByID(id)
  108. if err != nil {
  109. ctx.JSON(500, err.Error())
  110. } else {
  111. ctx.JSON(200, map[string]string{
  112. "result_code": "0",
  113. })
  114. }
  115. }
  116. func DeleteModelByID(id string) error {
  117. log.Info("delete model start. id=" + id)
  118. model, err := models.QueryModelById(id)
  119. if err == nil {
  120. log.Info("bucket=" + setting.Bucket + " path=" + model.Path)
  121. //err := storage.ObsRemoveObject(setting.Bucket, model.Path)
  122. //if err != nil {
  123. // log.Info("Failed to delete model. id=" + id)
  124. // return err
  125. //}
  126. return models.DeleteModelById(id)
  127. }
  128. return err
  129. }
  130. func DownloadModel(ctx *context.Context) {
  131. log.Info("download model start.")
  132. }
  133. func QueryModelByParameters(repoId int64, page int) ([]*models.AiModelManage, int64, error) {
  134. return models.QueryModel(&models.AiModelQueryOptions{
  135. ListOptions: models.ListOptions{
  136. Page: page,
  137. PageSize: setting.UI.IssuePagingNum,
  138. },
  139. RepoID: repoId,
  140. Type: -1,
  141. })
  142. }
  143. func ShowModelInfo(ctx *context.Context) {
  144. log.Info("ShowModelInfo start.")
  145. page := ctx.QueryInt("page")
  146. if page <= 0 {
  147. page = 1
  148. }
  149. repoId := ctx.QueryInt64("repoId")
  150. Type := -1
  151. modelResult, count, err := models.QueryModel(&models.AiModelQueryOptions{
  152. ListOptions: models.ListOptions{
  153. Page: page,
  154. PageSize: setting.UI.IssuePagingNum,
  155. },
  156. RepoID: repoId,
  157. Type: Type,
  158. })
  159. if err != nil {
  160. ctx.ServerError("Cloudbrain", err)
  161. return
  162. }
  163. pager := context.NewPagination(int(count), setting.UI.IssuePagingNum, page, 5)
  164. pager.SetDefaultParams(ctx)
  165. ctx.Data["Page"] = pager
  166. ctx.Data["PageIsCloudBrain"] = true
  167. ctx.Data["Tasks"] = modelResult
  168. ctx.HTML(200, "")
  169. }