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

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