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 13 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476
  1. package models
  2. import (
  3. "fmt"
  4. "time"
  5. "code.gitea.io/gitea/modules/log"
  6. "code.gitea.io/gitea/modules/setting"
  7. "code.gitea.io/gitea/modules/timeutil"
  8. "xorm.io/builder"
  9. "xorm.io/xorm"
  10. )
  11. type AiModelManage struct {
  12. ID string `xorm:"pk"`
  13. Name string `xorm:"INDEX NOT NULL"`
  14. Version string `xorm:"NOT NULL"`
  15. VersionCount int `xorm:"NOT NULL DEFAULT 0"`
  16. New int `xorm:"NOT NULL"`
  17. Type int `xorm:"NOT NULL"`
  18. Size int64 `xorm:"NOT NULL"`
  19. Description string `xorm:"varchar(2000)"`
  20. Label string `xorm:"varchar(1000)"`
  21. Path string `xorm:"varchar(400) NOT NULL"`
  22. DownloadCount int `xorm:"NOT NULL DEFAULT 0"`
  23. Engine int64 `xorm:"NOT NULL DEFAULT 0"`
  24. Status int `xorm:"NOT NULL DEFAULT 0"`
  25. StatusDesc string `xorm:"varchar(500)"`
  26. Accuracy string `xorm:"varchar(1000)"`
  27. AttachmentId string `xorm:"NULL"`
  28. RepoId int64 `xorm:"INDEX NULL"`
  29. CodeBranch string `xorm:"varchar(400) NULL"`
  30. CodeCommitID string `xorm:"NULL"`
  31. UserId int64 `xorm:"NOT NULL"`
  32. UserName string
  33. UserRelAvatarLink string
  34. TrainTaskInfo string `xorm:"text NULL"`
  35. CreatedUnix timeutil.TimeStamp `xorm:"created"`
  36. UpdatedUnix timeutil.TimeStamp `xorm:"updated"`
  37. IsCanOper bool
  38. IsCanDelete bool
  39. }
  40. type AiModelConvert struct {
  41. ID string `xorm:"pk"`
  42. Name string `xorm:"INDEX NOT NULL"`
  43. Status string `xorm:"NULL"`
  44. StatusResult string `xorm:"NULL"`
  45. SrcEngine int `xorm:"NOT NULL DEFAULT 0"`
  46. RepoId int64 `xorm:"INDEX NULL"`
  47. ModelId string `xorm:"NOT NULL"`
  48. ModelName string `xorm:"NULL"`
  49. ModelVersion string `xorm:"NOT NULL"`
  50. ModelPath string `xorm:"NULL"`
  51. DestFormat int `xorm:"NOT NULL DEFAULT 0"`
  52. NetOutputFormat int `xorm:"NULL"`
  53. UserId int64 `xorm:"NOT NULL"`
  54. CloudBrainTaskId string `xorm:"NULL"`
  55. ModelArtsVersionId string `xorm:"NULL"`
  56. ContainerID string
  57. ContainerIp string
  58. RunTime int64 `xorm:"NULL"`
  59. TrainJobDuration string
  60. InputShape string `xorm:"varchar(2000)"`
  61. InputDataFormat string `xorm:"NOT NULL"`
  62. Description string `xorm:"varchar(2000)"`
  63. Path string `xorm:"varchar(400) NOT NULL"`
  64. CreatedUnix timeutil.TimeStamp `xorm:"created"`
  65. UpdatedUnix timeutil.TimeStamp `xorm:"updated"`
  66. StartTime timeutil.TimeStamp
  67. EndTime timeutil.TimeStamp
  68. UserName string
  69. UserRelAvatarLink string
  70. IsCanOper bool
  71. IsCanDelete bool
  72. }
  73. type AiModelQueryOptions struct {
  74. ListOptions
  75. RepoID int64 // include all repos if empty
  76. UserID int64
  77. ModelID string
  78. SortType string
  79. New int
  80. // JobStatus CloudbrainStatus
  81. Type int
  82. Status int
  83. }
  84. func (a *AiModelConvert) IsGpuTrainTask() bool {
  85. if a.SrcEngine == 0 || a.SrcEngine == 1 {
  86. return true
  87. }
  88. return false
  89. }
  90. func ModelComputeAndSetDuration(task *AiModelConvert, result JobResultPayload) {
  91. if task.StartTime == 0 {
  92. task.StartTime = timeutil.TimeStamp(result.JobStatus.CreatedTime / 1000)
  93. }
  94. if task.EndTime == 0 {
  95. if result.JobStatus.CompletedTime > 0 {
  96. task.EndTime = timeutil.TimeStamp(result.JobStatus.CompletedTime / 1000)
  97. }
  98. }
  99. var d int64
  100. if task.StartTime == 0 {
  101. d = 0
  102. } else if task.EndTime == 0 {
  103. d = time.Now().Unix() - task.StartTime.AsTime().Unix()
  104. } else {
  105. d = task.EndTime.AsTime().Unix() - task.StartTime.AsTime().Unix()
  106. }
  107. if d < 0 {
  108. d = 0
  109. }
  110. task.RunTime = d
  111. task.TrainJobDuration = ConvertDurationToStr(d)
  112. }
  113. func ModelConvertSetDuration(task *AiModelConvert) {
  114. var d int64
  115. if task.StartTime == 0 {
  116. d = 0
  117. } else if task.EndTime == 0 {
  118. d = time.Now().Unix() - task.StartTime.AsTime().Unix()
  119. } else {
  120. d = task.EndTime.AsTime().Unix() - task.StartTime.AsTime().Unix()
  121. }
  122. if d < 0 {
  123. d = 0
  124. }
  125. task.RunTime = d
  126. task.TrainJobDuration = ConvertDurationToStr(d)
  127. }
  128. func UpdateModelConvertModelArts(id string, CloudBrainTaskId string, VersionId string) error {
  129. var sess *xorm.Session
  130. sess = x.ID(id)
  131. defer sess.Close()
  132. re, err := sess.Cols("cloud_brain_task_id,model_arts_version_id").Update(&AiModelConvert{
  133. CloudBrainTaskId: CloudBrainTaskId,
  134. ModelArtsVersionId: VersionId,
  135. })
  136. if err != nil {
  137. return err
  138. }
  139. log.Info("success to update cloud_brain_task_id from db.re=" + fmt.Sprint((re)))
  140. return nil
  141. }
  142. func UpdateModelConvertFailed(id string, status string, statusResult string) error {
  143. var sess *xorm.Session
  144. sess = x.ID(id)
  145. defer sess.Close()
  146. re, err := sess.Cols("status", "status_result").Update(&AiModelConvert{
  147. Status: status,
  148. StatusResult: statusResult,
  149. })
  150. if err != nil {
  151. return err
  152. }
  153. log.Info("success to update cloud_brain_task_id from db.re=" + fmt.Sprint((re)))
  154. return nil
  155. }
  156. func UpdateModelConvertCBTI(id string, CloudBrainTaskId string) error {
  157. var sess *xorm.Session
  158. sess = x.ID(id)
  159. defer sess.Close()
  160. re, err := sess.Cols("cloud_brain_task_id").Update(&AiModelConvert{
  161. CloudBrainTaskId: CloudBrainTaskId,
  162. })
  163. if err != nil {
  164. return err
  165. }
  166. log.Info("success to update cloud_brain_task_id from db.re=" + fmt.Sprint((re)))
  167. return nil
  168. }
  169. func UpdateModelConvert(job *AiModelConvert) error {
  170. return updateModelConvert(x, job)
  171. }
  172. func updateModelConvert(e Engine, job *AiModelConvert) error {
  173. var sess *xorm.Session
  174. sess = e.Where("id = ?", job.ID)
  175. _, err := sess.Cols("status", "train_job_duration", "run_time", "start_time", "end_time", "updated_unix").Update(job)
  176. return err
  177. }
  178. func SaveModelConvert(modelConvert *AiModelConvert) error {
  179. sess := x.NewSession()
  180. defer sess.Close()
  181. re, err := sess.Insert(modelConvert)
  182. if err != nil {
  183. log.Info("insert modelConvert error." + err.Error())
  184. return err
  185. }
  186. log.Info("success to save modelConvert db.re=" + fmt.Sprint((re)))
  187. return nil
  188. }
  189. func SaveModelToDb(model *AiModelManage) error {
  190. sess := x.NewSession()
  191. defer sess.Close()
  192. re, err := sess.Insert(model)
  193. if err != nil {
  194. log.Info("insert error." + err.Error())
  195. return err
  196. }
  197. log.Info("success to save db.re=" + fmt.Sprint((re)))
  198. return nil
  199. }
  200. func QueryModelConvertById(id string) (*AiModelConvert, error) {
  201. sess := x.NewSession()
  202. defer sess.Close()
  203. sess.Select("*").Table(new(AiModelConvert)).Where("id='" + id + "'")
  204. aiModelManageConvertList := make([]*AiModelConvert, 0)
  205. err := sess.Find(&aiModelManageConvertList)
  206. if err == nil {
  207. if len(aiModelManageConvertList) == 1 {
  208. return aiModelManageConvertList[0], nil
  209. }
  210. }
  211. return nil, err
  212. }
  213. func QueryModelById(id string) (*AiModelManage, error) {
  214. sess := x.NewSession()
  215. defer sess.Close()
  216. sess.Select("*").Table("ai_model_manage").
  217. Where("id='" + id + "'")
  218. aiModelManageList := make([]*AiModelManage, 0)
  219. err := sess.Find(&aiModelManageList)
  220. if err == nil {
  221. if len(aiModelManageList) == 1 {
  222. return aiModelManageList[0], nil
  223. }
  224. } else {
  225. log.Info("error=" + err.Error())
  226. }
  227. return nil, err
  228. }
  229. func DeleteModelConvertById(id string) error {
  230. sess := x.NewSession()
  231. defer sess.Close()
  232. re, err := sess.Delete(&AiModelConvert{
  233. ID: id,
  234. })
  235. if err != nil {
  236. return err
  237. }
  238. log.Info("success to delete AiModelManageConvert from db.re=" + fmt.Sprint((re)))
  239. return nil
  240. }
  241. func DeleteModelById(id string) error {
  242. sess := x.NewSession()
  243. defer sess.Close()
  244. re, err := sess.Delete(&AiModelManage{
  245. ID: id,
  246. })
  247. if err != nil {
  248. return err
  249. }
  250. log.Info("success to delete from db.re=" + fmt.Sprint((re)))
  251. return nil
  252. }
  253. func ModifyModelDescription(id string, description string) error {
  254. var sess *xorm.Session
  255. sess = x.ID(id)
  256. defer sess.Close()
  257. re, err := sess.Cols("description").Update(&AiModelManage{
  258. Description: description,
  259. })
  260. if err != nil {
  261. return err
  262. }
  263. log.Info("success to update description from db.re=" + fmt.Sprint((re)))
  264. return nil
  265. }
  266. func ModifyModelStatus(id string, modelSize int64, status int, modelPath string, statusDesc string) error {
  267. var sess *xorm.Session
  268. sess = x.ID(id)
  269. defer sess.Close()
  270. re, err := sess.Cols("size", "status", "path", "status_desc").Update(&AiModelManage{
  271. Size: modelSize,
  272. Status: status,
  273. Path: modelPath,
  274. StatusDesc: statusDesc,
  275. })
  276. if err != nil {
  277. return err
  278. }
  279. log.Info("success to update ModelStatus from db.re=" + fmt.Sprint((re)))
  280. return nil
  281. }
  282. func ModifyModelNewProperty(id string, new int, versioncount int) error {
  283. var sess *xorm.Session
  284. sess = x.ID(id)
  285. defer sess.Close()
  286. re, err := sess.Cols("new", "version_count").Update(&AiModelManage{
  287. New: new,
  288. VersionCount: versioncount,
  289. })
  290. if err != nil {
  291. return err
  292. }
  293. log.Info("success to update new property from db.re=" + fmt.Sprint((re)))
  294. return nil
  295. }
  296. func ModifyModelDownloadCount(id string) error {
  297. sess := x.NewSession()
  298. defer sess.Close()
  299. if _, err := sess.Exec("UPDATE `ai_model_manage` SET download_count = download_count + 1 WHERE id = ?", id); err != nil {
  300. return err
  301. }
  302. return nil
  303. }
  304. func QueryModelByName(name string, repoId int64) []*AiModelManage {
  305. sess := x.NewSession()
  306. defer sess.Close()
  307. sess.Select("*").Table("ai_model_manage").
  308. Where("name='" + name + "' and repo_id=" + fmt.Sprint(repoId)).OrderBy("created_unix desc")
  309. aiModelManageList := make([]*AiModelManage, 0)
  310. sess.Find(&aiModelManageList)
  311. return aiModelManageList
  312. }
  313. func QueryModel(opts *AiModelQueryOptions) ([]*AiModelManage, int64, error) {
  314. sess := x.NewSession()
  315. defer sess.Close()
  316. var cond = builder.NewCond()
  317. if opts.RepoID > 0 {
  318. cond = cond.And(
  319. builder.Eq{"ai_model_manage.repo_id": opts.RepoID},
  320. )
  321. }
  322. if opts.UserID > 0 {
  323. cond = cond.And(
  324. builder.Eq{"ai_model_manage.user_id": opts.UserID},
  325. )
  326. }
  327. if opts.New >= 0 {
  328. cond = cond.And(
  329. builder.Eq{"ai_model_manage.new": opts.New},
  330. )
  331. }
  332. if len(opts.ModelID) > 0 {
  333. cond = cond.And(
  334. builder.Eq{"ai_model_manage.id": opts.ModelID},
  335. )
  336. }
  337. if (opts.Type) >= 0 {
  338. cond = cond.And(
  339. builder.Eq{"ai_model_manage.type": opts.Type},
  340. )
  341. }
  342. if (opts.Status) >= 0 {
  343. cond = cond.And(
  344. builder.Eq{"ai_model_manage.status": opts.Status},
  345. )
  346. }
  347. count, err := sess.Where(cond).Count(new(AiModelManage))
  348. if err != nil {
  349. return nil, 0, fmt.Errorf("Count: %v", err)
  350. }
  351. if opts.Page >= 0 && opts.PageSize > 0 {
  352. var start int
  353. if opts.Page == 0 {
  354. start = 0
  355. } else {
  356. start = (opts.Page - 1) * opts.PageSize
  357. }
  358. sess.Limit(opts.PageSize, start)
  359. }
  360. sess.OrderBy("ai_model_manage.created_unix DESC")
  361. aiModelManages := make([]*AiModelManage, 0, setting.UI.IssuePagingNum)
  362. if err := sess.Table("ai_model_manage").Where(cond).
  363. Find(&aiModelManages); err != nil {
  364. return nil, 0, fmt.Errorf("Find: %v", err)
  365. }
  366. return aiModelManages, count, nil
  367. }
  368. func QueryModelConvertByRepoID(repoId int64) ([]*AiModelConvert, error) {
  369. sess := x.NewSession()
  370. defer sess.Close()
  371. var cond = builder.NewCond()
  372. cond = cond.And(
  373. builder.Eq{"ai_model_convert.repo_id": repoId},
  374. )
  375. sess.OrderBy("ai_model_convert.created_unix DESC")
  376. aiModelManageConvert := make([]*AiModelConvert, 0)
  377. if err := sess.Table(new(AiModelConvert)).Where(cond).
  378. Find(&aiModelManageConvert); err != nil {
  379. return nil, fmt.Errorf("Find: %v", err)
  380. }
  381. return aiModelManageConvert, nil
  382. }
  383. func QueryModelConvertByUserID(userID int64) ([]*AiModelConvert, error) {
  384. sess := x.NewSession()
  385. defer sess.Close()
  386. var cond = builder.NewCond()
  387. cond = cond.And(
  388. builder.Eq{"ai_model_convert.user_id": userID},
  389. )
  390. sess.OrderBy("ai_model_convert.created_unix DESC")
  391. aiModelManageConvert := make([]*AiModelConvert, 0)
  392. if err := sess.Table(new(AiModelConvert)).Where(cond).
  393. Find(&aiModelManageConvert); err != nil {
  394. return nil, fmt.Errorf("Find: %v", err)
  395. }
  396. return aiModelManageConvert, nil
  397. }
  398. func QueryModelConvert(opts *AiModelQueryOptions) ([]*AiModelConvert, int64, error) {
  399. sess := x.NewSession()
  400. defer sess.Close()
  401. var cond = builder.NewCond()
  402. if opts.RepoID > 0 {
  403. cond = cond.And(
  404. builder.Eq{"ai_model_convert.repo_id": opts.RepoID},
  405. )
  406. }
  407. if opts.UserID > 0 {
  408. cond = cond.And(
  409. builder.Eq{"ai_model_convert.user_id": opts.UserID},
  410. )
  411. }
  412. count, err := sess.Where(cond).Count(new(AiModelConvert))
  413. if err != nil {
  414. return nil, 0, fmt.Errorf("Count: %v", err)
  415. }
  416. if opts.Page >= 0 && opts.PageSize > 0 {
  417. var start int
  418. if opts.Page == 0 {
  419. start = 0
  420. } else {
  421. start = (opts.Page - 1) * opts.PageSize
  422. }
  423. sess.Limit(opts.PageSize, start)
  424. }
  425. sess.OrderBy("ai_model_convert.created_unix DESC")
  426. aiModelManageConvert := make([]*AiModelConvert, 0, setting.UI.IssuePagingNum)
  427. if err := sess.Table(new(AiModelConvert)).Where(cond).
  428. Find(&aiModelManageConvert); err != nil {
  429. return nil, 0, fmt.Errorf("Find: %v", err)
  430. }
  431. return aiModelManageConvert, count, nil
  432. }