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.

cloudbrain.go 48 kB

3 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
3 years ago
4 years ago
4 years ago
3 years ago
3 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
3 years ago
3 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
3 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
3 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
4 years ago
4 years ago
4 years ago
3 years ago
4 years ago
4 years ago
4 years ago
3 years ago
3 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
3 years ago
4 years ago
4 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
3 years ago
3 years ago
4 years ago
4 years ago
3 years ago
3 years ago
3 years ago
4 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
4 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419
  1. package models
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "strings"
  6. "time"
  7. "xorm.io/builder"
  8. "xorm.io/xorm"
  9. "code.gitea.io/gitea/modules/log"
  10. "code.gitea.io/gitea/modules/setting"
  11. "code.gitea.io/gitea/modules/timeutil"
  12. )
  13. type CloudbrainStatus string
  14. type JobType string
  15. type ModelArtsJobStatus string
  16. const (
  17. NPUResource = "NPU"
  18. GPUResource = "CPU/GPU"
  19. //notebook storage category
  20. EVSCategory = "EVS"
  21. EFSCategory = "EFS"
  22. ManagedOwnership = "MANAGED"
  23. DetectedOwnership = "DEDICATED"
  24. NotebookFeature = "NOTEBOOK"
  25. DefaultFeature = "DEFAULT"
  26. JobWaiting CloudbrainStatus = "WAITING"
  27. JobStopped CloudbrainStatus = "STOPPED"
  28. JobSucceeded CloudbrainStatus = "SUCCEEDED"
  29. JobFailed CloudbrainStatus = "FAILED"
  30. JobRunning CloudbrainStatus = "RUNNING"
  31. JobTypeDebug JobType = "DEBUG"
  32. JobTypeBenchmark JobType = "BENCHMARK"
  33. JobTypeSnn4imagenet JobType = "SNN4IMAGENET"
  34. JobTypeBrainScore JobType = "BRAINSCORE"
  35. JobTypeTrain JobType = "TRAIN"
  36. JobTypeInference JobType = "INFERENCE"
  37. //notebook
  38. ModelArtsCreateQueue ModelArtsJobStatus = "CREATE_QUEUING" //免费资源创建排队中
  39. ModelArtsCreating ModelArtsJobStatus = "CREATING" //创建中
  40. ModelArtsCreateFailed ModelArtsJobStatus = "CREATE_FAILED" //创建失败
  41. ModelArtsStartQueuing ModelArtsJobStatus = "START_QUEUING" //免费资源启动排队中
  42. ModelArtsReadyToStart ModelArtsJobStatus = "READY_TO_START" //免费资源等待启动
  43. ModelArtsStarting ModelArtsJobStatus = "STARTING" //启动中
  44. ModelArtsRestarting ModelArtsJobStatus = "RESTARTING" //重启中
  45. ModelArtsStartFailed ModelArtsJobStatus = "START_FAILED" //启动失败
  46. ModelArtsRunning ModelArtsJobStatus = "RUNNING" //运行中
  47. ModelArtsStopping ModelArtsJobStatus = "STOPPING" //停止中
  48. ModelArtsStopped ModelArtsJobStatus = "STOPPED" //停止
  49. ModelArtsUnavailable ModelArtsJobStatus = "UNAVAILABLE" //故障
  50. ModelArtsDeleted ModelArtsJobStatus = "DELETED" //已删除
  51. ModelArtsResizing ModelArtsJobStatus = "RESIZING" //规格变更中
  52. ModelArtsResizFailed ModelArtsJobStatus = "RESIZE_FAILED" //规格变更失败
  53. //trainjob
  54. ModelArtsTrainJobUnknown ModelArtsJobStatus = "UNKNOWN" //作业状态未知
  55. ModelArtsTrainJobInit ModelArtsJobStatus = "INIT" //作业初始化状态
  56. ModelArtsTrainJobImageCreating ModelArtsJobStatus = "IMAGE_CREATING" //作业镜像正在创建
  57. ModelArtsTrainJobImageFailed ModelArtsJobStatus = "IMAGE_FAILED" //作业镜像创建失败
  58. ModelArtsTrainJobSubmitTrying ModelArtsJobStatus = "SUBMIT_TRYING" //作业正在提交
  59. ModelArtsTrainJobSubmitFailed ModelArtsJobStatus = "SUBMIT_FAILED" //作业提交失败
  60. ModelArtsTrainJobDeleteFailed ModelArtsJobStatus = "DELETE_FAILED" //作业删除失败
  61. ModelArtsTrainJobWaiting ModelArtsJobStatus = "WAITING" //作业正在排队中
  62. ModelArtsTrainJobRunning ModelArtsJobStatus = "RUNNING" //作业正在运行中
  63. ModelArtsTrainJobKilling ModelArtsJobStatus = "KILLING" //作业正在取消
  64. ModelArtsTrainJobCompleted ModelArtsJobStatus = "COMPLETED" //作业已经完成
  65. ModelArtsTrainJobFailed ModelArtsJobStatus = "FAILED" //作业运行失败
  66. ModelArtsTrainJobKilled ModelArtsJobStatus = "KILLED" //作业取消成功
  67. ModelArtsTrainJobCanceled ModelArtsJobStatus = "CANCELED" //作业取消
  68. ModelArtsTrainJobLost ModelArtsJobStatus = "LOST" //作业丢失
  69. ModelArtsTrainJobScaling ModelArtsJobStatus = "SCALING" //作业正在扩容
  70. ModelArtsTrainJobSubmitModelFailed ModelArtsJobStatus = "SUBMIT_MODEL_FAILED" //提交模型失败
  71. ModelArtsTrainJobDeployServiceFailed ModelArtsJobStatus = "DEPLOY_SERVICE_FAILED" //部署服务失败
  72. ModelArtsTrainJobCheckInit ModelArtsJobStatus = "CHECK_INIT" //审核作业初始化
  73. ModelArtsTrainJobCheckRunning ModelArtsJobStatus = "CHECK_RUNNING" //审核作业正在运行中
  74. ModelArtsTrainJobCheckRunningCompleted ModelArtsJobStatus = "CHECK_RUNNING_COMPLETED" //审核作业已经完成
  75. ModelArtsTrainJobCheckFailed ModelArtsJobStatus = "CHECK_FAILED" //审核作业失败
  76. )
  77. type Cloudbrain struct {
  78. ID int64 `xorm:"pk autoincr"`
  79. JobID string `xorm:"INDEX NOT NULL"`
  80. JobType string `xorm:"INDEX NOT NULL DEFAULT 'DEBUG'"`
  81. JobName string
  82. Status string
  83. UserID int64
  84. RepoID int64
  85. SubTaskName string
  86. ContainerID string
  87. ContainerIp string
  88. CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
  89. UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
  90. Duration int64
  91. TrainJobDuration string
  92. Image string //GPU镜像名称
  93. GpuQueue string //GPU类型即GPU队列
  94. ResourceSpecId int //GPU规格id
  95. DeletedAt time.Time `xorm:"deleted"`
  96. CanDebug bool `xorm:"-"`
  97. CanDel bool `xorm:"-"`
  98. CanModify bool `xorm:"-"`
  99. Type int
  100. BenchmarkTypeID int
  101. BenchmarkChildTypeID int
  102. VersionID int64 //版本id
  103. VersionName string `xorm:"INDEX"` //当前版本
  104. Uuid string //数据集id
  105. DatasetName string
  106. VersionCount int //任务的当前版本数量,不包括删除的
  107. IsLatestVersion string //是否是最新版本,1是,0否
  108. CommitID string //提交的仓库代码id
  109. PreVersionName string //父版本名称
  110. ComputeResource string //计算资源,例如npu
  111. EngineID int64 //引擎id
  112. TrainUrl string //输出模型的obs路径
  113. BranchName string //分支名称
  114. Parameters string //传给modelarts的param参数
  115. BootFile string //启动文件
  116. DataUrl string //数据集的obs路径
  117. LogUrl string //日志输出的obs路径
  118. PreVersionId int64 //父版本的版本id
  119. FlavorCode string //modelarts上的规格id
  120. Description string `xorm:"varchar(256)"` //描述
  121. WorkServerNumber int //节点数
  122. FlavorName string //规格名称
  123. EngineName string //引擎名称
  124. TotalVersionCount int //任务的所有版本数量,包括删除的
  125. LabelName string //标签名称
  126. ModelName string //模型名称
  127. ModelVersion string //模型版本
  128. CkptName string //权重文件名称
  129. ResultUrl string //推理结果的obs路径
  130. User *User `xorm:"-"`
  131. Repo *Repository `xorm:"-"`
  132. }
  133. type CloudbrainInfo struct {
  134. Cloudbrain `xorm:"extends"`
  135. User `xorm:"extends"`
  136. }
  137. type CloudBrainLoginResult struct {
  138. Code string
  139. Msg string
  140. Payload map[string]interface{}
  141. }
  142. type TaskRole struct {
  143. Name string `json:"name"`
  144. TaskNumber int `json:"taskNumber"`
  145. MinSucceededTaskCount int `json:"minSucceededTaskCount"`
  146. MinFailedTaskCount int `json:"minFailedTaskCount"`
  147. CPUNumber int `json:"cpuNumber"`
  148. GPUNumber int `json:"gpuNumber"`
  149. MemoryMB int `json:"memoryMB"`
  150. ShmMB int `json:"shmMB"`
  151. Command string `json:"command"`
  152. NeedIBDevice bool `json:"needIBDevice"`
  153. IsMainRole bool `json:"isMainRole"`
  154. UseNNI bool `json:"useNNI"`
  155. }
  156. type StHostPath struct {
  157. Path string `json:"path"`
  158. MountPath string `json:"mountPath"`
  159. ReadOnly bool `json:"readOnly"`
  160. }
  161. type Volume struct {
  162. HostPath StHostPath `json:"hostPath"`
  163. }
  164. type CreateJobParams struct {
  165. JobName string `json:"jobName"`
  166. RetryCount int8 `json:"retryCount"`
  167. GpuType string `json:"gpuType"`
  168. Image string `json:"image"`
  169. TaskRoles []TaskRole `json:"taskRoles"`
  170. Volumes []Volume `json:"volumes"`
  171. }
  172. type CreateJobResult struct {
  173. Code string `json:"code"`
  174. Msg string `json:"msg"`
  175. Payload map[string]interface{} `json:"payload"`
  176. }
  177. type GetJobResult struct {
  178. Code string `json:"code"`
  179. Msg string `json:"msg"`
  180. Payload map[string]interface{} `json:"payload"`
  181. }
  182. type GetImagesResult struct {
  183. Code string `json:"code"`
  184. Msg string `json:"msg"`
  185. Payload GetImagesPayload `json:"payload"`
  186. }
  187. type GetImagesPayload struct {
  188. Count int `json:"count"`
  189. TotalPages int `json:"totalPages,omitempty"`
  190. ImageInfo []*ImageInfo `json:"rows"`
  191. }
  192. type CloudbrainsOptions struct {
  193. ListOptions
  194. RepoID int64 // include all repos if empty
  195. UserID int64
  196. JobID string
  197. SortType string
  198. CloudbrainIDs []int64
  199. // JobStatus CloudbrainStatus
  200. Type int
  201. JobTypes []string
  202. VersionName string
  203. IsLatestVersion string
  204. JobTypeNot bool
  205. }
  206. type TaskPod struct {
  207. TaskRoleStatus struct {
  208. Name string `json:"name"`
  209. } `json:"taskRoleStatus"`
  210. //TaskStatuses []struct {
  211. // TaskIndex int `json:"taskIndex"`
  212. // PodUID string `json:"podUid"`
  213. // PodIP string `json:"podIp"`
  214. // PodName string `json:"podName"`
  215. // ContainerID string `json:"containerId"`
  216. // ContainerIP string `json:"containerIp"`
  217. // ContainerGpus string `json:"containerGpus"`
  218. // State string `json:"state"`
  219. // StartAt time.Time `json:"startAt"`
  220. // FinishedAt time.Time `json:"finishedAt"`
  221. // ExitCode int `json:"exitCode"`
  222. // ExitDiagnostics string `json:"exitDiagnostics"`
  223. // RetriedCount int `json:"retriedCount"`
  224. // StartTime string
  225. // FinishedTime string
  226. //} `json:"taskStatuses"`
  227. TaskStatuses []TaskStatuses `json:"taskStatuses"`
  228. }
  229. type TaskStatuses struct {
  230. TaskIndex int `json:"taskIndex"`
  231. PodUID string `json:"podUid"`
  232. PodIP string `json:"podIp"`
  233. PodName string `json:"podName"`
  234. ContainerID string `json:"containerId"`
  235. ContainerIP string `json:"containerIp"`
  236. ContainerGpus string `json:"containerGpus"`
  237. State string `json:"state"`
  238. StartAt time.Time `json:"startAt"`
  239. FinishedAt time.Time `json:"finishedAt"`
  240. ExitCode int `json:"exitCode"`
  241. ExitDiagnostics string `json:"exitDiagnostics"`
  242. RetriedCount int `json:"retriedCount"`
  243. StartTime string
  244. FinishedTime string
  245. }
  246. type TaskInfo struct {
  247. Username string `json:"username"`
  248. TaskName string `json:"task_name"`
  249. CodeName string `json:"code_name"`
  250. BenchmarkCategory []string `json:"selected_category"`
  251. CodeLink string `json:"code_link"`
  252. GpuType string `json:"gpu_type"`
  253. }
  254. func ConvertToTaskPod(input map[string]interface{}) (TaskPod, error) {
  255. data, _ := json.Marshal(input)
  256. var taskPod TaskPod
  257. err := json.Unmarshal(data, &taskPod)
  258. taskPod.TaskStatuses[0].StartTime = time.Unix(taskPod.TaskStatuses[0].StartAt.Unix()+8*3600, 0).UTC().Format("2006-01-02 15:04:05")
  259. taskPod.TaskStatuses[0].FinishedTime = time.Unix(taskPod.TaskStatuses[0].FinishedAt.Unix()+8*3600, 0).UTC().Format("2006-01-02 15:04:05")
  260. //if the task is not finished or stopped,the cloudbrain renturns 0001-01-01 08:00:00, the finishedTime shows with -
  261. if strings.HasPrefix(taskPod.TaskStatuses[0].FinishedTime, "0001") {
  262. taskPod.TaskStatuses[0].FinishedTime = "-"
  263. }
  264. return taskPod, err
  265. }
  266. type JobResultPayload struct {
  267. ID string `json:"id"`
  268. Name string `json:"name"`
  269. Platform string `json:"platform"`
  270. JobStatus struct {
  271. Username string `json:"username"`
  272. State string `json:"state"`
  273. SubState string `json:"subState"`
  274. ExecutionType string `json:"executionType"`
  275. Retries int `json:"retries"`
  276. CreatedTime int64 `json:"createdTime"`
  277. CompletedTime int64 `json:"completedTime"`
  278. AppID string `json:"appId"`
  279. AppProgress string `json:"appProgress"`
  280. AppTrackingURL string `json:"appTrackingUrl"`
  281. AppLaunchedTime int64 `json:"appLaunchedTime"`
  282. AppCompletedTime interface{} `json:"appCompletedTime"`
  283. AppExitCode int `json:"appExitCode"`
  284. AppExitDiagnostics string `json:"appExitDiagnostics"`
  285. AppExitType interface{} `json:"appExitType"`
  286. VirtualCluster string `json:"virtualCluster"`
  287. StartTime string
  288. EndTime string
  289. } `json:"jobStatus"`
  290. TaskRoles map[string]interface{} `json:"taskRoles"`
  291. Resource struct {
  292. CPU int `json:"cpu"`
  293. Memory string `json:"memory"`
  294. NvidiaComGpu int `json:"nvidia.com/gpu"`
  295. } `json:"resource"`
  296. Config struct {
  297. Image string `json:"image"`
  298. JobID string `json:"jobId"`
  299. GpuType string `json:"gpuType"`
  300. JobName string `json:"jobName"`
  301. JobType string `json:"jobType"`
  302. TaskRoles []struct {
  303. Name string `json:"name"`
  304. ShmMB int `json:"shmMB"`
  305. Command string `json:"command"`
  306. MemoryMB int `json:"memoryMB"`
  307. CPUNumber int `json:"cpuNumber"`
  308. GpuNumber int `json:"gpuNumber"`
  309. IsMainRole bool `json:"isMainRole"`
  310. TaskNumber int `json:"taskNumber"`
  311. NeedIBDevice bool `json:"needIBDevice"`
  312. MinFailedTaskCount int `json:"minFailedTaskCount"`
  313. MinSucceededTaskCount int `json:"minSucceededTaskCount"`
  314. } `json:"taskRoles"`
  315. RetryCount int `json:"retryCount"`
  316. } `json:"config"`
  317. Userinfo struct {
  318. User string `json:"user"`
  319. OrgID string `json:"org_id"`
  320. } `json:"userinfo"`
  321. }
  322. func ConvertToJobResultPayload(input map[string]interface{}) (JobResultPayload, error) {
  323. data, _ := json.Marshal(input)
  324. var jobResultPayload JobResultPayload
  325. err := json.Unmarshal(data, &jobResultPayload)
  326. jobResultPayload.JobStatus.StartTime = time.Unix(jobResultPayload.JobStatus.CreatedTime/1000, 0).Format("2006-01-02 15:04:05")
  327. jobResultPayload.JobStatus.EndTime = time.Unix(jobResultPayload.JobStatus.CompletedTime/1000, 0).Format("2006-01-02 15:04:05")
  328. if jobResultPayload.JobStatus.State == string(JobWaiting) {
  329. jobResultPayload.JobStatus.StartTime = "-"
  330. jobResultPayload.JobStatus.EndTime = "-"
  331. }
  332. return jobResultPayload, err
  333. }
  334. type ImagesResultPayload struct {
  335. Images []struct {
  336. ID int `json:"id"`
  337. Name string `json:"name"`
  338. Place string `json:"place"`
  339. Description string `json:"description"`
  340. Provider string `json:"provider"`
  341. Createtime string `json:"createtime"`
  342. Remark string `json:"remark"`
  343. } `json:"taskStatuses"`
  344. }
  345. type ImageInfo struct {
  346. ID int `json:"id"`
  347. Name string `json:"name"`
  348. Place string `json:"place"`
  349. Description string `json:"description"`
  350. Provider string `json:"provider"`
  351. Createtime string `json:"createtime"`
  352. Remark string `json:"remark"`
  353. IsPublic int `json:"isPublic"`
  354. PlaceView string
  355. }
  356. type Categories struct {
  357. Category []*Category `json:"category"`
  358. }
  359. type Category struct {
  360. Id int `json:"id"`
  361. Value string `json:"value"`
  362. }
  363. type BenchmarkTypes struct {
  364. BenchmarkType []*BenchmarkType `json:"type"`
  365. }
  366. type BenchmarkType struct {
  367. Id int `json:"id"`
  368. First string `json:"first"` //一级算法类型名称
  369. Second []*BenchmarkDataset `json:"second"`
  370. }
  371. type BenchmarkDataset struct {
  372. Id int `json:"id"`
  373. Value string `json:"value"` //二级算法类型名称
  374. Attachment string `json:"attachment"` //数据集的uuid
  375. Owner string `json:"owner"` //评估脚本所在仓库的拥有者
  376. RepoName string `json:"repo_name"` //评估脚本所在仓库的名称
  377. }
  378. type GpuInfos struct {
  379. GpuInfo []*GpuInfo `json:"gpu_type"`
  380. }
  381. type GpuInfo struct {
  382. Id int `json:"id"`
  383. Value string `json:"value"`
  384. Queue string `json:"queue"`
  385. }
  386. type ResourceSpecs struct {
  387. ResourceSpec []*ResourceSpec `json:"resorce_specs"`
  388. }
  389. type ResourceSpec struct {
  390. Id int `json:"id"`
  391. CpuNum int `json:"cpu"`
  392. GpuNum int `json:"gpu"`
  393. MemMiB int `json:"memMiB"`
  394. ShareMemMiB int `json:"shareMemMiB"`
  395. }
  396. type FlavorInfos struct {
  397. FlavorInfo []*FlavorInfo `json:"flavor_info"`
  398. }
  399. type FlavorInfo struct {
  400. Id int `json:"id"`
  401. Value string `json:"value"`
  402. Desc string `json:"desc"`
  403. }
  404. type PoolInfos struct {
  405. PoolInfo []*PoolInfo `json:"pool_info"`
  406. }
  407. type PoolInfo struct {
  408. PoolId string `json:"pool_id"`
  409. PoolName string `json:"pool_name"`
  410. PoolType string `json:"pool_type"`
  411. }
  412. type CommitImageParams struct {
  413. Ip string `json:"ip"`
  414. TaskContainerId string `json:"taskContainerId"`
  415. ImageTag string `json:"imageTag"`
  416. ImageDescription string `json:"imageDescription"`
  417. }
  418. type CommitImageResult struct {
  419. Code string `json:"code"`
  420. Msg string `json:"msg"`
  421. Payload map[string]interface{} `json:"payload"`
  422. }
  423. type GetJobLogParams struct {
  424. Size string `json:"size"`
  425. Sort string `json:"sort"`
  426. QueryInfo QueryInfo `json:"query"`
  427. }
  428. type QueryInfo struct {
  429. MatchInfo MatchInfo `json:"match"`
  430. }
  431. type MatchInfo struct {
  432. PodName string `json:"kubernetes.pod.name"`
  433. }
  434. type GetJobLogResult struct {
  435. ScrollID string `json:"_scroll_id"`
  436. Took int `json:"took"`
  437. TimedOut bool `json:"timed_out"`
  438. Shards struct {
  439. Total int `json:"total"`
  440. Successful int `json:"successful"`
  441. Skipped int `json:"skipped"`
  442. Failed int `json:"failed"`
  443. } `json:"_shards"`
  444. Hits struct {
  445. Hits []Hits `json:"hits"`
  446. } `json:"hits"`
  447. }
  448. type Hits struct {
  449. Index string `json:"_index"`
  450. Type string `json:"_type"`
  451. ID string `json:"_id"`
  452. Source struct {
  453. Message string `json:"message"`
  454. } `json:"_source"`
  455. Sort []int `json:"sort"`
  456. }
  457. type GetAllJobLogParams struct {
  458. Scroll string `json:"scroll"`
  459. ScrollID string `json:"scroll_id"`
  460. }
  461. type DeleteJobLogTokenParams struct {
  462. ScrollID string `json:"scroll_id"`
  463. }
  464. type DeleteJobLogTokenResult struct {
  465. Succeeded bool `json:"succeeded"`
  466. NumFreed int `json:"num_freed"`
  467. }
  468. type CloudBrainResult struct {
  469. Code string `json:"code"`
  470. Msg string `json:"msg"`
  471. }
  472. type CreateNotebook2Params struct {
  473. JobName string `json:"name"`
  474. Description string `json:"description"`
  475. Duration int64 `json:"duration"` //ms
  476. Feature string `json:"feature"`
  477. PoolID string `json:"pool_id"`
  478. Flavor string `json:"flavor"`
  479. ImageID string `json:"image_id"`
  480. WorkspaceID string `json:"workspace_id"`
  481. Volume VolumeReq `json:"volume"`
  482. }
  483. type VolumeReq struct {
  484. Capacity int `json:"capacity"`
  485. Category string `json:"category"`
  486. Ownership string `json:"ownership"`
  487. Uri string `json:"uri"`
  488. }
  489. type CreateNotebookParams struct {
  490. JobName string `json:"name"`
  491. Description string `json:"description"`
  492. ProfileID string `json:"profile_id"`
  493. Flavor string `json:"flavor"`
  494. Spec Spec `json:"spec"`
  495. Workspace Workspace `json:"workspace"`
  496. Pool Pool `json:"pool"`
  497. }
  498. type Pool struct {
  499. ID string `json:"id"`
  500. Name string `json:"name"`
  501. Type string `json:"type"`
  502. }
  503. type Workspace struct {
  504. ID string `json:"id"`
  505. }
  506. type Spec struct {
  507. Storage Storage `json:"storage"`
  508. AutoStop AutoStop `json:"auto_stop"`
  509. }
  510. type AutoStop struct {
  511. Enable bool `json:"enable"`
  512. Duration int `json:"duration"`
  513. }
  514. type Storage struct {
  515. Type string `json:"type"`
  516. Location Location `json:"location"`
  517. }
  518. type Location struct {
  519. Path string `json:"path"`
  520. }
  521. type NotebookResult struct {
  522. ErrorCode string `json:"error_code"`
  523. ErrorMsg string `json:"error_msg"`
  524. }
  525. type CreateNotebookResult struct {
  526. ErrorCode string `json:"error_code"`
  527. ErrorMsg string `json:"error_msg"`
  528. ID string `json:"id"`
  529. Name string `json:"name"`
  530. Description string `json:"description"`
  531. Status string `json:"status"`
  532. CreationTimestamp string `json:"creation_timestamp"`
  533. LatestUpdateTimestamp string `json:"latest_update_timestamp"`
  534. Profile struct {
  535. ID string `json:"id"`
  536. Name string `json:"name"`
  537. Description string `json:"description"`
  538. DeType string `json:"de_type"`
  539. FlavorType string `json:"flavor_type"`
  540. } `json:"profile"`
  541. Flavor string `json:"flavor"`
  542. FlavorDetails struct {
  543. Name string `json:"name"`
  544. Status string `json:"status"`
  545. QueuingNum int `json:"queuing_num"`
  546. QueueLeftTime int `json:"queue_left_time"` //s
  547. Duration int `json:"duration"` //auto_stop_time s
  548. } `json:"flavor_details"`
  549. }
  550. type GetNotebookResult struct {
  551. ErrorCode string `json:"error_code"`
  552. ErrorMsg string `json:"error_msg"`
  553. ID string `json:"id"`
  554. Name string `json:"name"`
  555. Description string `json:"description"`
  556. Status string `json:"status"`
  557. CreationTimestamp string `json:"creation_timestamp"`
  558. CreateTime string
  559. LatestUpdateTimestamp string `json:"latest_update_timestamp"`
  560. LatestUpdateTime string
  561. Profile struct {
  562. ID string `json:"id"`
  563. Name string `json:"name"`
  564. Description string `json:"description"`
  565. DeType string `json:"de_type"`
  566. FlavorType string `json:"flavor_type"`
  567. } `json:"profile"`
  568. Flavor string `json:"flavor"`
  569. FlavorDetails struct {
  570. Name string `json:"name"`
  571. Status string `json:"status"`
  572. QueuingNum int `json:"queuing_num"`
  573. QueueLeftTime int `json:"queue_left_time"` //s
  574. Duration int `json:"duration"` //auto_stop_time s
  575. } `json:"flavor_details"`
  576. QueuingInfo struct {
  577. ID string `json:"id"`
  578. Name string `json:"name"`
  579. Flavor string `json:"flavor"`
  580. DeType string `json:"de_type"`
  581. Status string `json:"status"`
  582. BeginTimestamp int `json:"begin_timestamp"` //time of instance begin in queue
  583. BeginTime string
  584. RemainTime int `json:"remain_time"` //remain time of instance
  585. EndTimestamp int `json:"end_timestamp"` //
  586. EndTime string
  587. Rank int `json:"rank"` //rank of instance in queue
  588. } `json:"queuing_info"`
  589. Spec struct {
  590. Annotations struct {
  591. TargetDomain string `json:"target_domain"`
  592. Url string `json:"url"`
  593. } `json:"annotations"`
  594. } `json:"spec"`
  595. }
  596. type GetNotebook2Result struct {
  597. ErrorCode string `json:"error_code"`
  598. ErrorMsg string `json:"error_msg"`
  599. FailReason string `json:"fail_reason"`
  600. ID string `json:"id"`
  601. Name string `json:"name"`
  602. Description string `json:"description"`
  603. Status string `json:"status"`
  604. Url string `json:"url"` //实例访问的URL
  605. Token string `json:"token"` //notebook鉴权使用的token信息
  606. Flavor string `json:"flavor"`
  607. CreateTime string
  608. LatestUpdateTime string
  609. CreateAt int64 `json:"create_at"` //实例创建的时间,UTC毫秒
  610. UpdateAt int64 `json:"update_at"` //实例最后更新(不包括保活心跳)的时间,UTC毫秒
  611. Image struct {
  612. Name string `json:"name"`
  613. Status string `json:"status"`
  614. QueuingNum int `json:"queuing_num"`
  615. QueueLeftTime int `json:"queue_left_time"` //s
  616. Duration int `json:"duration"` //auto_stop_time s
  617. } `json:"image"`
  618. Lease struct {
  619. CreateTime int64 `json:"create_at"` //实例创建的时间,UTC毫秒
  620. Duration int64 `json:"duration"` //实例运行时长,以创建时间为起点计算,即“创建时间+duration > 当前时刻”时,系统会自动停止实例
  621. UpdateTime int64 `json:"update_at"` //实例最后更新(不包括保活心跳)的时间,UTC毫秒
  622. } `json:"lease"` //实例自动停止的倒计时信息
  623. VolumeRes struct {
  624. Capacity int `json:"capacity"`
  625. Category string `json:"category"`
  626. MountPath string `json:"mount_path"`
  627. Ownership string `json:"ownership"`
  628. Status string `json:"status"`
  629. } `json:"volume"`
  630. }
  631. type GetTokenParams struct {
  632. Auth Auth `json:"auth"`
  633. }
  634. type Auth struct {
  635. Identity Identity `json:"identity"`
  636. Scope Scope `json:"scope"`
  637. }
  638. type Scope struct {
  639. Project Project `json:"project"`
  640. }
  641. type Project struct {
  642. Name string `json:"name"`
  643. }
  644. type Identity struct {
  645. Methods []string `json:"methods"`
  646. Password Password `json:"password"`
  647. }
  648. type Password struct {
  649. User NotebookUser `json:"user"`
  650. }
  651. type NotebookUser struct {
  652. Name string `json:"name"`
  653. Password string `json:"password"`
  654. Domain Domain `json:"domain"`
  655. }
  656. type Domain struct {
  657. Name string `json:"name"`
  658. }
  659. const (
  660. ActionStart = "start"
  661. ActionStop = "stop"
  662. ActionRestart = "restart"
  663. ActionQueue = "queue"
  664. ActionDequeue = "dequeue"
  665. )
  666. type NotebookAction struct {
  667. Action string `json:"action"`
  668. }
  669. type NotebookActionResult struct {
  670. ErrorCode string `json:"error_code"`
  671. ErrorMsg string `json:"error_msg"`
  672. CurrentStatus string `json:"current_status"`
  673. PreviousState string `json:"previous_state"`
  674. Status string `json:"status"`
  675. }
  676. type NotebookGetJobTokenResult struct {
  677. ErrorCode string `json:"error_code"`
  678. ErrorMsg string `json:"error_msg"`
  679. Token string `json:"token"`
  680. }
  681. type NotebookDelResult struct {
  682. InstanceID string `json:"instance_id"`
  683. }
  684. type CreateTrainJobParams struct {
  685. JobName string `json:"job_name"`
  686. Description string `json:"job_desc"`
  687. Config Config `json:"config"`
  688. WorkspaceID string `json:"workspace_id"`
  689. }
  690. type Config struct {
  691. WorkServerNum int `json:"worker_server_num"`
  692. AppUrl string `json:"app_url"` //训练作业的代码目录
  693. BootFileUrl string `json:"boot_file_url"` //训练作业的代码启动文件,需要在代码目录下
  694. Parameter []Parameter `json:"parameter"`
  695. DataUrl string `json:"data_url"` //训练作业需要的数据集OBS路径URL
  696. EngineID int64 `json:"engine_id"`
  697. TrainUrl string `json:"train_url"` //训练作业的输出文件OBS路径URL
  698. LogUrl string `json:"log_url"`
  699. //UserImageUrl string `json:"user_image_url"`
  700. //UserCommand string `json:"user_command"`
  701. CreateVersion bool `json:"create_version"`
  702. Flavor Flavor `json:"flavor"`
  703. PoolID string `json:"pool_id"`
  704. }
  705. type CreateInferenceJobParams struct {
  706. JobName string `json:"job_name"`
  707. Description string `json:"job_desc"`
  708. InfConfig InfConfig `json:"config"`
  709. WorkspaceID string `json:"workspace_id"`
  710. }
  711. type InfConfig struct {
  712. WorkServerNum int `json:"worker_server_num"`
  713. AppUrl string `json:"app_url"` //训练作业的代码目录
  714. BootFileUrl string `json:"boot_file_url"` //训练作业的代码启动文件,需要在代码目录下
  715. Parameter []Parameter `json:"parameter"`
  716. DataUrl string `json:"data_url"` //训练作业需要的数据集OBS路径URL
  717. EngineID int64 `json:"engine_id"`
  718. LogUrl string `json:"log_url"`
  719. CreateVersion bool `json:"create_version"`
  720. Flavor Flavor `json:"flavor"`
  721. PoolID string `json:"pool_id"`
  722. }
  723. type CreateTrainJobVersionParams struct {
  724. Description string `json:"job_desc"`
  725. Config TrainJobVersionConfig `json:"config"`
  726. }
  727. type TrainJobVersionConfig struct {
  728. WorkServerNum int `json:"worker_server_num"`
  729. AppUrl string `json:"app_url"` //训练作业的代码目录
  730. BootFileUrl string `json:"boot_file_url"` //训练作业的代码启动文件,需要在代码目录下
  731. Parameter []Parameter `json:"parameter"`
  732. DataUrl string `json:"data_url"` //训练作业需要的数据集OBS路径URL
  733. EngineID int64 `json:"engine_id"`
  734. TrainUrl string `json:"train_url"` //训练作业的输出文件OBS路径URL
  735. LogUrl string `json:"log_url"`
  736. Flavor Flavor `json:"flavor"`
  737. PoolID string `json:"pool_id"`
  738. PreVersionId int64 `json:"pre_version_id"`
  739. }
  740. type CreateConfigParams struct {
  741. ConfigName string `json:"config_name"`
  742. Description string `json:"config_desc"`
  743. WorkServerNum int `json:"worker_server_num"`
  744. AppUrl string `json:"app_url"` //训练作业的代码目录
  745. BootFileUrl string `json:"boot_file_url"` //训练作业的代码启动文件,需要在代码目录下
  746. Parameter []Parameter `json:"parameter"`
  747. DataUrl string `json:"data_url"` //训练作业需要的数据集OBS路径URL
  748. EngineID int64 `json:"engine_id"`
  749. TrainUrl string `json:"train_url"` //训练作业的输出文件OBS路径URL
  750. LogUrl string `json:"log_url"`
  751. Flavor Flavor `json:"flavor"`
  752. PoolID string `json:"pool_id"`
  753. }
  754. type Parameter struct {
  755. Label string `json:"label"`
  756. Value string `json:"value"`
  757. }
  758. type Parameters struct {
  759. Parameter []Parameter `json:"parameter"`
  760. }
  761. type DataSource struct {
  762. DatasetID string `json:"dataset_id"`
  763. DatasetVersion string `json:"dataset_version"`
  764. Type string `json:"type"`
  765. DataUrl string `json:"data_url"`
  766. }
  767. type Volumes struct {
  768. Nfs Nfs `json:"nfs"`
  769. HostPath HostPath `json:"host_path"`
  770. }
  771. type Nfs struct {
  772. ID string `json:"id"`
  773. SourcePath string `json:"src_path"`
  774. DestPath string `json:"dest_path"`
  775. ReadOnly bool `json:"read_only"`
  776. }
  777. type HostPath struct {
  778. SourcePath string `json:"src_path"`
  779. DestPath string `json:"dest_path"`
  780. ReadOnly bool `json:"read_only"`
  781. }
  782. type Flavor struct {
  783. Code string `json:"code"`
  784. }
  785. type CreateTrainJobResult struct {
  786. ErrorCode string `json:"error_code"`
  787. ErrorMsg string `json:"error_msg"`
  788. IsSuccess bool `json:"is_success"`
  789. JobName string `json:"job_name"`
  790. JobID int64 `json:"job_id"`
  791. Status int `json:"status"`
  792. CreateTime int64 `json:"create_time"`
  793. VersionID int64 `json:"version_id"`
  794. ResourceID string `json:"resource_id"`
  795. VersionName string `json:"version_name"`
  796. }
  797. type CreateTrainJobConfigResult struct {
  798. ErrorCode string `json:"error_code"`
  799. ErrorMsg string `json:"error_msg"`
  800. IsSuccess bool `json:"is_success"`
  801. }
  802. type GetResourceSpecsResult struct {
  803. ErrorCode string `json:"error_code"`
  804. ErrorMsg string `json:"error_msg"`
  805. IsSuccess bool `json:"is_success"`
  806. SpecTotalCount int `json:"spec_total_count"`
  807. Specs []Specs `json:"specs"`
  808. }
  809. type Specs struct {
  810. Core string `json:"core"`
  811. Cpu string `json:"cpu"`
  812. IsNoResource bool `json:"no_resource"`
  813. GpuType string `json:"gpu_type"`
  814. SpecID int64 `json:"spec_id"`
  815. GpuNum int `json:"gpu_num"`
  816. SpecCode string `json:"spec_code"`
  817. Storage string `json:"storage"`
  818. MaxNum int `json:"max_num"`
  819. UnitNum int `json:"unit_num"`
  820. InterfaceType int `json:"interface_type"`
  821. }
  822. type GetConfigListResult struct {
  823. ErrorCode string `json:"error_code"`
  824. ErrorMsg string `json:"error_msg"`
  825. IsSuccess bool `json:"is_success"`
  826. ConfigTotalCount int `json:"config_total_count"`
  827. ParaConfigs []ParaConfig `json:"configs"`
  828. }
  829. type ParaConfig struct {
  830. ConfigName string `json:"config_name"`
  831. ConfigDesc string `json:"config_desc"`
  832. CreateTime int64 `json:"create_time"`
  833. EngineType int `json:"engine_type"`
  834. EngineName string `json:"engine_name"`
  835. EngineId int64 `json:"engine_id"`
  836. EngineVersion string `json:"engine_version"`
  837. UserImageUrl string `json:"user_image_url"`
  838. UserCommand string `json:"user_command"`
  839. Result GetConfigResult
  840. }
  841. type GetConfigResult struct {
  842. ErrorCode string `json:"error_code"`
  843. ErrorMsg string `json:"error_msg"`
  844. IsSuccess bool `json:"is_success"`
  845. ConfigName string `json:"config_name"`
  846. Description string `json:"config_desc"`
  847. WorkServerNum int `json:"worker_server_num"`
  848. AppUrl string `json:"app_url"` //训练作业的代码目录
  849. BootFileUrl string `json:"boot_file_url"` //训练作业的代码启动文件,需要在代码目录下
  850. Parameter []Parameter `json:"parameter"`
  851. DataUrl string `json:"data_url"` //训练作业需要的数据集OBS路径URL
  852. EngineID int64 `json:"engine_id"`
  853. TrainUrl string `json:"train_url"` //训练作业的输出文件OBS路径URL
  854. LogUrl string `json:"log_url"`
  855. Flavor Flavor `json:"flavor"`
  856. PoolID string `json:"pool_id"`
  857. }
  858. type ErrorResult struct {
  859. ErrorCode string `json:"error_code"`
  860. ErrorMsg string `json:"error_message"`
  861. IsSuccess bool `json:"is_success"`
  862. }
  863. type GetTrainJobResult struct {
  864. IsSuccess bool `json:"is_success"`
  865. JobName string `json:"job_name"`
  866. JobID int64 `json:"job_id"`
  867. Description string `json:"job_desc"`
  868. IntStatus int `json:"status"`
  869. Status string
  870. LongCreateTime int64 `json:"create_time"`
  871. CreateTime string
  872. Duration int64 `json:"duration"` //训练作业的运行时间,单位为毫秒
  873. TrainJobDuration string //训练作业的运行时间,格式为hh:mm:ss
  874. VersionID int64 `json:"version_id"`
  875. ResourceID string `json:"resource_id"`
  876. VersionName string `json:"version_name"`
  877. PreVersionID int64 `json:"pre_version_id"`
  878. WorkServerNum int `json:"worker_server_num"`
  879. AppUrl string `json:"app_url"` //训练作业的代码目录
  880. BootFileUrl string `json:"boot_file_url"` //训练作业的代码启动文件,需要在代码目录下
  881. Parameter []Parameter `json:"parameter"`
  882. DataUrl string `json:"data_url"` //训练作业需要的数据集OBS路径URL
  883. EngineID int64 `json:"engine_id"`
  884. EngineName string `json:"engine_name"`
  885. EngineVersion string `json:"engine_version"`
  886. TrainUrl string `json:"train_url"` //训练作业的输出文件OBS路径URL
  887. LogUrl string `json:"log_url"`
  888. Flavor Flavor `json:"flavor"`
  889. PoolID string `json:"pool_id"`
  890. PoolName string `json:"pool_name"`
  891. NasMountPath string `json:"nas_mount_path"`
  892. NasShareAddr string `json:"nas_share_addr"`
  893. DatasetName string
  894. ModelMetricList string `json:"model_metric_list"` //列表里包含f1_score,recall,precision,accuracy,若有的话
  895. }
  896. type GetTrainJobLogResult struct {
  897. ErrorCode string `json:"error_code"`
  898. ErrorMsg string `json:"error_msg"`
  899. IsSuccess bool `json:"is_success"`
  900. Content string `json:"content"`
  901. Lines int `json:"lines"`
  902. StartLine string `json:"start_line"`
  903. EndLine string `json:"end_line"`
  904. }
  905. type GetTrainJobLogFileNamesResult struct {
  906. ErrorCode string `json:"error_code"`
  907. ErrorMsg string `json:"error_msg"`
  908. IsSuccess bool `json:"is_success"`
  909. LogFileList []string `json:"log_file_list"`
  910. }
  911. type TrainJobResult struct {
  912. ErrorCode string `json:"error_code"`
  913. ErrorMsg string `json:"error_msg"`
  914. IsSuccess bool `json:"is_success"`
  915. }
  916. type LogFile struct {
  917. Name string
  918. }
  919. func Cloudbrains(opts *CloudbrainsOptions) ([]*CloudbrainInfo, int64, error) {
  920. sess := x.NewSession()
  921. defer sess.Close()
  922. var cond = builder.NewCond()
  923. if opts.RepoID > 0 {
  924. cond = cond.And(
  925. builder.Eq{"cloudbrain.repo_id": opts.RepoID},
  926. )
  927. }
  928. if opts.UserID > 0 {
  929. cond = cond.And(
  930. builder.Eq{"cloudbrain.user_id": opts.UserID},
  931. )
  932. }
  933. if (opts.JobID) != "" {
  934. cond = cond.And(
  935. builder.Eq{"cloudbrain.job_id": opts.JobID},
  936. )
  937. }
  938. if (opts.Type) >= 0 {
  939. cond = cond.And(
  940. builder.Eq{"cloudbrain.type": opts.Type},
  941. )
  942. }
  943. if len(opts.JobTypes) > 0 {
  944. if opts.JobTypeNot {
  945. cond = cond.And(
  946. builder.NotIn("cloudbrain.job_type", opts.JobTypes),
  947. )
  948. } else {
  949. cond = cond.And(
  950. builder.In("cloudbrain.job_type", opts.JobTypes),
  951. )
  952. }
  953. }
  954. if (opts.IsLatestVersion) != "" {
  955. cond = cond.And(
  956. builder.Eq{"cloudbrain.is_latest_version": opts.IsLatestVersion},
  957. )
  958. }
  959. if len(opts.CloudbrainIDs) > 0 {
  960. cond = cond.And(builder.In("cloudbrain.id", opts.CloudbrainIDs))
  961. }
  962. count, err := sess.Where(cond).Count(new(Cloudbrain))
  963. if err != nil {
  964. return nil, 0, fmt.Errorf("Count: %v", err)
  965. }
  966. if opts.Page >= 0 && opts.PageSize > 0 {
  967. var start int
  968. if opts.Page == 0 {
  969. start = 0
  970. } else {
  971. start = (opts.Page - 1) * opts.PageSize
  972. }
  973. sess.Limit(opts.PageSize, start)
  974. }
  975. sess.OrderBy("cloudbrain.created_unix DESC")
  976. cloudbrains := make([]*CloudbrainInfo, 0, setting.UI.IssuePagingNum)
  977. if err := sess.Table(&Cloudbrain{}).Where(cond).
  978. Join("left", "`user`", "cloudbrain.user_id = `user`.id").
  979. Find(&cloudbrains); err != nil {
  980. return nil, 0, fmt.Errorf("Find: %v", err)
  981. }
  982. return cloudbrains, count, nil
  983. }
  984. func QueryModelTrainJobVersionList(jobId string) ([]*CloudbrainInfo, int, error) {
  985. sess := x.NewSession()
  986. defer sess.Close()
  987. var cond = builder.NewCond()
  988. cond = cond.And(
  989. builder.Eq{"cloudbrain.job_id": jobId},
  990. )
  991. cond = cond.And(
  992. builder.Eq{"cloudbrain.Status": "COMPLETED"},
  993. )
  994. sess.OrderBy("cloudbrain.created_unix DESC")
  995. cloudbrains := make([]*CloudbrainInfo, 0)
  996. if err := sess.Table(&Cloudbrain{}).Where(cond).
  997. Find(&cloudbrains); err != nil {
  998. return nil, 0, fmt.Errorf("Find: %v", err)
  999. }
  1000. return cloudbrains, int(len(cloudbrains)), nil
  1001. }
  1002. func QueryModelTrainJobList(repoId int64) ([]*CloudbrainInfo, int, error) {
  1003. sess := x.NewSession()
  1004. defer sess.Close()
  1005. var cond = builder.NewCond()
  1006. cond = cond.And(
  1007. builder.Eq{"repo_id": repoId},
  1008. )
  1009. cond = cond.And(
  1010. builder.Eq{"Status": "COMPLETED"},
  1011. )
  1012. cond = cond.And(
  1013. builder.Eq{"job_type": "TRAIN"},
  1014. )
  1015. cloudbrains := make([]*CloudbrainInfo, 0)
  1016. if err := sess.Select("job_id,job_name").Table(&Cloudbrain{}).Where(cond).OrderBy("created_unix DESC").
  1017. Find(&cloudbrains); err != nil {
  1018. return nil, 0, fmt.Errorf("Find: %v", err)
  1019. }
  1020. keys := make(map[string]string)
  1021. uniqueElements := make([]*CloudbrainInfo, 0)
  1022. for _, entry := range cloudbrains {
  1023. if _, value := keys[entry.JobID]; !value {
  1024. keys[entry.JobID] = entry.JobName
  1025. uniqueElements = append(uniqueElements, entry)
  1026. }
  1027. }
  1028. return uniqueElements, int(len(uniqueElements)), nil
  1029. }
  1030. func CloudbrainsVersionList(opts *CloudbrainsOptions) ([]*CloudbrainInfo, int, error) {
  1031. sess := x.NewSession()
  1032. defer sess.Close()
  1033. var cond = builder.NewCond()
  1034. if opts.RepoID > 0 {
  1035. cond = cond.And(
  1036. builder.Eq{"cloudbrain.repo_id": opts.RepoID},
  1037. )
  1038. }
  1039. if opts.UserID > 0 {
  1040. cond = cond.And(
  1041. builder.Eq{"cloudbrain.user_id": opts.UserID},
  1042. )
  1043. }
  1044. if (opts.Type) >= 0 {
  1045. cond = cond.And(
  1046. builder.Eq{"cloudbrain.type": opts.Type},
  1047. )
  1048. }
  1049. if (opts.JobID) != "" {
  1050. cond = cond.And(
  1051. builder.Eq{"cloudbrain.job_id": opts.JobID},
  1052. )
  1053. }
  1054. if len(opts.JobTypes) > 0 {
  1055. cond = cond.And(
  1056. builder.In("cloudbrain.job_type", opts.JobTypes),
  1057. )
  1058. }
  1059. if len(opts.CloudbrainIDs) > 0 {
  1060. cond = cond.And(builder.In("cloudbrain.id", opts.CloudbrainIDs))
  1061. }
  1062. count, err := sess.Where(cond).Count(new(Cloudbrain))
  1063. if err != nil {
  1064. return nil, 0, fmt.Errorf("Count: %v", err)
  1065. }
  1066. if opts.Page >= 0 && opts.PageSize > 0 {
  1067. var start int
  1068. if opts.Page == 0 {
  1069. start = 0
  1070. } else {
  1071. start = (opts.Page - 1) * opts.PageSize
  1072. }
  1073. sess.Limit(opts.PageSize, start)
  1074. }
  1075. sess.OrderBy("cloudbrain.created_unix DESC")
  1076. cloudbrains := make([]*CloudbrainInfo, 0, setting.UI.IssuePagingNum)
  1077. if err := sess.Table(&Cloudbrain{}).Where(cond).
  1078. Join("left", "`user`", "cloudbrain.user_id = `user`.id").
  1079. Find(&cloudbrains); err != nil {
  1080. return nil, 0, fmt.Errorf("Find: %v", err)
  1081. }
  1082. return cloudbrains, int(count), nil
  1083. }
  1084. func CreateCloudbrain(cloudbrain *Cloudbrain) (err error) {
  1085. if _, err = x.Insert(cloudbrain); err != nil {
  1086. return err
  1087. }
  1088. return nil
  1089. }
  1090. func getRepoCloudBrain(cb *Cloudbrain) (*Cloudbrain, error) {
  1091. has, err := x.Get(cb)
  1092. if err != nil {
  1093. return nil, err
  1094. } else if !has {
  1095. return nil, ErrJobNotExist{}
  1096. }
  1097. return cb, nil
  1098. }
  1099. func GetRepoCloudBrainByJobID(repoID int64, jobID string) (*Cloudbrain, error) {
  1100. cb := &Cloudbrain{JobID: jobID, RepoID: repoID}
  1101. return getRepoCloudBrain(cb)
  1102. }
  1103. func GetCloudbrainByJobID(jobID string) (*Cloudbrain, error) {
  1104. cb := &Cloudbrain{JobID: jobID}
  1105. return getRepoCloudBrain(cb)
  1106. }
  1107. func GetCloudbrainByJobIDAndVersionName(jobID string, versionName string) (*Cloudbrain, error) {
  1108. cb := &Cloudbrain{JobID: jobID, VersionName: versionName}
  1109. return getRepoCloudBrain(cb)
  1110. }
  1111. func GetCloudbrainByJobIDAndIsLatestVersion(jobID string, isLatestVersion string) (*Cloudbrain, error) {
  1112. cb := &Cloudbrain{JobID: jobID, IsLatestVersion: isLatestVersion}
  1113. return getRepoCloudBrain(cb)
  1114. }
  1115. func GetCloudbrainsNeededStopByUserID(userID int64) ([]*Cloudbrain, error) {
  1116. cloudBrains := make([]*Cloudbrain, 0)
  1117. err := x.Cols("job_id", "status", "type", "job_type", "version_id").Where("user_id=? AND status !=?", userID, string(JobStopped)).Find(&cloudBrains)
  1118. return cloudBrains, err
  1119. }
  1120. func GetCloudbrainsNeededStopByRepoID(repoID int64) ([]*Cloudbrain, error) {
  1121. cloudBrains := make([]*Cloudbrain, 0)
  1122. err := x.Cols("job_id", "status", "type", "job_type", "version_id").Where("repo_id=? AND status !=?", repoID, string(JobStopped)).Find(&cloudBrains)
  1123. return cloudBrains, err
  1124. }
  1125. func SetCloudbrainStatusByJobID(jobID string, status CloudbrainStatus) (err error) {
  1126. cb := &Cloudbrain{JobID: jobID, Status: string(status)}
  1127. _, err = x.Cols("status").Where("cloudbrain.job_id=?", jobID).Update(cb)
  1128. return
  1129. }
  1130. func SetTrainJobStatusByJobID(jobID string, status string, duration int64, trainjobduration string) (err error) {
  1131. cb := &Cloudbrain{JobID: jobID, Status: string(status), Duration: duration, TrainJobDuration: trainjobduration}
  1132. _, err = x.Cols("status", "duration", "train_job_duration").Where("cloudbrain.job_id=?", jobID).Update(cb)
  1133. return
  1134. }
  1135. func SetVersionCountAndLatestVersion(jobID string, versionName string, versionCount int, isLatestVersion string, totalVersionCount int) (err error) {
  1136. cb := &Cloudbrain{JobID: jobID, VersionName: versionName, VersionCount: versionCount, IsLatestVersion: isLatestVersion, TotalVersionCount: totalVersionCount}
  1137. _, err = x.Cols("version_Count", "is_latest_version", "total_version_count").Where("cloudbrain.job_id=? AND cloudbrain.version_name=?", jobID, versionName).Update(cb)
  1138. return
  1139. }
  1140. func UpdateJob(job *Cloudbrain) error {
  1141. return updateJob(x, job)
  1142. }
  1143. func updateJob(e Engine, job *Cloudbrain) error {
  1144. _, err := e.ID(job.ID).AllCols().Update(job)
  1145. return err
  1146. }
  1147. func UpdateTrainJobVersion(job *Cloudbrain) error {
  1148. return updateJobTrainVersion(x, job)
  1149. }
  1150. func updateJobTrainVersion(e Engine, job *Cloudbrain) error {
  1151. var sess *xorm.Session
  1152. sess = e.Where("job_id = ? AND version_name=?", job.JobID, job.VersionName)
  1153. _, err := sess.Cols("status", "train_job_duration").Update(job)
  1154. return err
  1155. }
  1156. func DeleteJob(job *Cloudbrain) error {
  1157. return deleteJob(x, job)
  1158. }
  1159. func deleteJob(e Engine, job *Cloudbrain) error {
  1160. _, err := e.ID(job.ID).Delete(job)
  1161. return err
  1162. }
  1163. func GetCloudbrainByName(jobName string) (*Cloudbrain, error) {
  1164. cb := &Cloudbrain{JobName: jobName}
  1165. return getRepoCloudBrain(cb)
  1166. }
  1167. func CanDelJob(isSigned bool, user *User, job *CloudbrainInfo) bool {
  1168. if !isSigned || (job.Status != string(JobStopped) && job.Status != string(JobFailed) && job.Status != string(ModelArtsStartFailed) && job.Status != string(ModelArtsCreateFailed)) {
  1169. return false
  1170. }
  1171. repo, err := GetRepositoryByID(job.RepoID)
  1172. if err != nil {
  1173. log.Error("GetRepositoryByID failed:%v", err.Error())
  1174. return false
  1175. }
  1176. permission, _ := GetUserRepoPermission(repo, user)
  1177. if err != nil {
  1178. log.Error("GetUserRepoPermission failed:%v", err.Error())
  1179. return false
  1180. }
  1181. if (user.ID == job.UserID && permission.AccessMode >= AccessModeWrite) || user.IsAdmin || permission.AccessMode >= AccessModeAdmin {
  1182. return true
  1183. }
  1184. return false
  1185. }
  1186. func GetCloudBrainUnStoppedJob() ([]*Cloudbrain, error) {
  1187. cloudbrains := make([]*Cloudbrain, 0, 10)
  1188. return cloudbrains, x.
  1189. NotIn("status",
  1190. JobStopped, JobSucceeded, JobFailed, ModelArtsCreateFailed, ModelArtsStartFailed, ModelArtsUnavailable, ModelArtsResizFailed, ModelArtsDeleted,
  1191. ModelArtsStopped, ModelArtsTrainJobCanceled, ModelArtsTrainJobCheckFailed, ModelArtsTrainJobCompleted, ModelArtsTrainJobDeleteFailed, ModelArtsTrainJobDeployServiceFailed,
  1192. ModelArtsTrainJobFailed, ModelArtsTrainJobImageFailed, ModelArtsTrainJobKilled, ModelArtsTrainJobLost, ModelArtsTrainJobSubmitFailed, ModelArtsTrainJobSubmitModelFailed).
  1193. Limit(100).
  1194. Find(&cloudbrains)
  1195. }
  1196. func GetCloudbrainCountByUserID(userID int64, jobType string) (int, error) {
  1197. count, err := x.In("status", JobWaiting, JobRunning).And("job_type = ? and user_id = ? and type = ?", jobType, userID, TypeCloudBrainOne).Count(new(Cloudbrain))
  1198. return int(count), err
  1199. }
  1200. func GetCloudbrainNotebookCountByUserID(userID int64) (int, error) {
  1201. count, err := x.In("status", ModelArtsCreateQueue, ModelArtsCreating, ModelArtsStarting, ModelArtsReadyToStart, ModelArtsResizing, ModelArtsStartQueuing, ModelArtsRunning, ModelArtsRestarting).
  1202. And("job_type = ? and user_id = ? and type = ?", JobTypeDebug, userID, TypeCloudBrainTwo).Count(new(Cloudbrain))
  1203. return int(count), err
  1204. }
  1205. func GetCloudbrainTrainJobCountByUserID(userID int64) (int, error) {
  1206. count, err := x.In("status", ModelArtsTrainJobInit, ModelArtsTrainJobImageCreating, ModelArtsTrainJobSubmitTrying, ModelArtsTrainJobWaiting, ModelArtsTrainJobRunning, ModelArtsTrainJobScaling, ModelArtsTrainJobCheckInit, ModelArtsTrainJobCheckRunning, ModelArtsTrainJobCheckRunningCompleted).
  1207. And("job_type = ? and user_id = ? and type = ?", JobTypeTrain, userID, TypeCloudBrainTwo).Count(new(Cloudbrain))
  1208. return int(count), err
  1209. }
  1210. func GetCloudbrainInferenceJobCountByUserID(userID int64) (int, error) {
  1211. count, err := x.In("status", ModelArtsTrainJobInit, ModelArtsTrainJobImageCreating, ModelArtsTrainJobSubmitTrying, ModelArtsTrainJobWaiting, ModelArtsTrainJobRunning, ModelArtsTrainJobScaling, ModelArtsTrainJobCheckInit, ModelArtsTrainJobCheckRunning, ModelArtsTrainJobCheckRunningCompleted).
  1212. And("job_type = ? and user_id = ? and type = ?", JobTypeInference, userID, TypeCloudBrainTwo).Count(new(Cloudbrain))
  1213. return int(count), err
  1214. }
  1215. func UpdateInferenceJob(job *Cloudbrain) error {
  1216. return updateInferenceJob(x, job)
  1217. }
  1218. func updateInferenceJob(e Engine, job *Cloudbrain) error {
  1219. var sess *xorm.Session
  1220. sess = e.Where("job_id = ?", job.JobID)
  1221. _, err := sess.Cols("status", "train_job_duration").Update(job)
  1222. return err
  1223. }
  1224. func RestartCloudbrain(old *Cloudbrain, new *Cloudbrain) (err error) {
  1225. sess := x.NewSession()
  1226. defer sess.Close()
  1227. if err = sess.Begin(); err != nil {
  1228. return err
  1229. }
  1230. if _, err = sess.Delete(old); err != nil {
  1231. sess.Rollback()
  1232. return err
  1233. }
  1234. if _, err = sess.Insert(new); err != nil {
  1235. sess.Rollback()
  1236. return err
  1237. }
  1238. if err = sess.Commit(); err != nil {
  1239. return err
  1240. }
  1241. return nil
  1242. }