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.

modelarts.go 33 kB

4 years ago
4 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
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 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
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
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
4 years ago
4 years ago
4 years ago
4 years ago
3 years ago
4 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
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
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
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
3 years ago
4 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
4 years ago
3 years ago
4 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
4 years ago
4 years ago
3 years ago
4 years ago
3 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
4 years ago
3 years ago
4 years ago
4 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
4 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 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
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
4 years ago
4 years ago
3 years ago
4 years ago
4 years ago
4 years ago
3 years ago
4 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
3 years ago
4 years ago
3 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
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
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
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
3 years ago
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145
  1. package repo
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "io"
  6. "io/ioutil"
  7. "net/http"
  8. "os"
  9. "path"
  10. "strconv"
  11. "strings"
  12. "time"
  13. "code.gitea.io/gitea/models"
  14. "code.gitea.io/gitea/modules/auth"
  15. "code.gitea.io/gitea/modules/base"
  16. "code.gitea.io/gitea/modules/context"
  17. "code.gitea.io/gitea/modules/git"
  18. "code.gitea.io/gitea/modules/log"
  19. "code.gitea.io/gitea/modules/modelarts"
  20. "code.gitea.io/gitea/modules/obs"
  21. "code.gitea.io/gitea/modules/setting"
  22. "code.gitea.io/gitea/modules/storage"
  23. "github.com/unknwon/com"
  24. )
  25. const (
  26. // tplModelArtsNotebookIndex base.TplName = "repo/modelarts/notebook/index"
  27. tplModelArtsNotebookIndex base.TplName = "repo/modelarts/notebook/index"
  28. tplModelArtsNotebookNew base.TplName = "repo/modelarts/notebook/new"
  29. tplModelArtsNotebookShow base.TplName = "repo/modelarts/notebook/show"
  30. tplModelArtsIndex base.TplName = "repo/modelarts/index"
  31. tplModelArtsNew base.TplName = "repo/modelarts/new"
  32. tplModelArtsShow base.TplName = "repo/modelarts/show"
  33. tplModelArtsTrainJobIndex base.TplName = "repo/modelarts/trainjob/index"
  34. tplModelArtsTrainJobNew base.TplName = "repo/modelarts/trainjob/new"
  35. tplModelArtsTrainJobShow base.TplName = "repo/modelarts/trainjob/show"
  36. tplModelArtsTrainJobShowModels base.TplName = "repo/modelarts/trainjob/models/index"
  37. )
  38. // MustEnableDataset check if repository enable internal cb
  39. func MustEnableModelArts(ctx *context.Context) {
  40. if !ctx.Repo.CanRead(models.UnitTypeCloudBrain) {
  41. ctx.NotFound("MustEnableCloudbrain", nil)
  42. return
  43. }
  44. }
  45. func ModelArtsIndex(ctx *context.Context) {
  46. MustEnableModelArts(ctx)
  47. repo := ctx.Repo.Repository
  48. page := ctx.QueryInt("page")
  49. if page <= 0 {
  50. page = 1
  51. }
  52. ciTasks, count, err := models.Cloudbrains(&models.CloudbrainsOptions{
  53. ListOptions: models.ListOptions{
  54. Page: page,
  55. PageSize: setting.UI.IssuePagingNum,
  56. },
  57. RepoID: repo.ID,
  58. Type: models.TypeCloudBrainTwo,
  59. })
  60. if err != nil {
  61. ctx.ServerError("Cloudbrain", err)
  62. return
  63. }
  64. for i, task := range ciTasks {
  65. if task.Status == string(models.JobRunning) {
  66. ciTasks[i].CanDebug = true
  67. } else {
  68. ciTasks[i].CanDebug = false
  69. }
  70. ciTasks[i].CanDel = models.CanDelJob(ctx.IsSigned, ctx.User, task)
  71. }
  72. pager := context.NewPagination(int(count), setting.UI.IssuePagingNum, page, 5)
  73. pager.SetDefaultParams(ctx)
  74. ctx.Data["Page"] = pager
  75. ctx.Data["PageIsCloudBrain"] = true
  76. ctx.Data["Tasks"] = ciTasks
  77. ctx.HTML(200, tplModelArtsIndex)
  78. }
  79. func ModelArtsNew(ctx *context.Context) {
  80. ctx.Data["PageIsCloudBrain"] = true
  81. t := time.Now()
  82. var jobName = jobNamePrefixValid(cutString(ctx.User.Name, 5)) + t.Format("2006010215") + strconv.Itoa(int(t.Unix()))[5:]
  83. ctx.Data["job_name"] = jobName
  84. attachs, err := models.GetModelArtsUserAttachments(ctx.User.ID)
  85. if err != nil {
  86. ctx.ServerError("GetAllUserAttachments failed:", err)
  87. return
  88. }
  89. ctx.Data["attachments"] = attachs
  90. ctx.Data["dataset_path"] = modelarts.DataSetMountPath
  91. ctx.Data["env"] = modelarts.NotebookEnv
  92. ctx.Data["notebook_type"] = modelarts.NotebookType
  93. if modelarts.FlavorInfos == nil {
  94. json.Unmarshal([]byte(setting.FlavorInfos), &modelarts.FlavorInfos)
  95. }
  96. ctx.Data["flavors"] = modelarts.FlavorInfos.FlavorInfo
  97. ctx.HTML(200, tplModelArtsNew)
  98. }
  99. func ModelArtsCreate(ctx *context.Context, form auth.CreateModelArtsForm) {
  100. ctx.Data["PageIsCloudBrain"] = true
  101. jobName := form.JobName
  102. uuid := form.Attachment
  103. description := form.Description
  104. //repo := ctx.Repo.Repository
  105. if !jobNamePattern.MatchString(jobName) {
  106. ctx.RenderWithErr(ctx.Tr("repo.cloudbrain_jobname_err"), tplModelArtsNew, &form)
  107. return
  108. }
  109. err := modelarts.GenerateTask(ctx, jobName, uuid, description)
  110. if err != nil {
  111. ctx.RenderWithErr(err.Error(), tplModelArtsNew, &form)
  112. return
  113. }
  114. ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/modelarts")
  115. }
  116. func ModelArtsShow(ctx *context.Context) {
  117. ctx.Data["PageIsCloudBrain"] = true
  118. var jobID = ctx.Params(":jobid")
  119. task, err := models.GetCloudbrainByJobID(jobID)
  120. if err != nil {
  121. ctx.Data["error"] = err.Error()
  122. ctx.RenderWithErr(err.Error(), tplModelArtsIndex, nil)
  123. return
  124. }
  125. result, err := modelarts.GetJob(jobID)
  126. if err != nil {
  127. ctx.Data["error"] = err.Error()
  128. ctx.RenderWithErr(err.Error(), tplModelArtsIndex, nil)
  129. return
  130. }
  131. if result != nil {
  132. task.Status = result.Status
  133. err = models.UpdateJob(task)
  134. if err != nil {
  135. ctx.Data["error"] = err.Error()
  136. ctx.RenderWithErr(err.Error(), tplModelArtsIndex, nil)
  137. return
  138. }
  139. createTime, _ := com.StrTo(result.CreationTimestamp).Int64()
  140. result.CreateTime = time.Unix(int64(createTime/1000), 0).Format("2006-01-02 15:04:05")
  141. endTime, _ := com.StrTo(result.LatestUpdateTimestamp).Int64()
  142. result.LatestUpdateTime = time.Unix(int64(endTime/1000), 0).Format("2006-01-02 15:04:05")
  143. result.QueuingInfo.BeginTime = time.Unix(int64(result.QueuingInfo.BeginTimestamp/1000), 0).Format("2006-01-02 15:04:05")
  144. result.QueuingInfo.EndTime = time.Unix(int64(result.QueuingInfo.EndTimestamp/1000), 0).Format("2006-01-02 15:04:05")
  145. }
  146. ctx.Data["task"] = task
  147. ctx.Data["jobID"] = jobID
  148. ctx.Data["result"] = result
  149. ctx.HTML(200, tplModelArtsShow)
  150. }
  151. func ModelArtsDebug(ctx *context.Context) {
  152. var jobID = ctx.Params(":jobid")
  153. _, err := models.GetCloudbrainByJobID(jobID)
  154. if err != nil {
  155. ctx.ServerError("GetCloudbrainByJobID failed", err)
  156. return
  157. }
  158. result, err := modelarts.GetJob(jobID)
  159. if err != nil {
  160. ctx.RenderWithErr(err.Error(), tplModelArtsIndex, nil)
  161. return
  162. }
  163. res, err := modelarts.GetJobToken(jobID)
  164. if err != nil {
  165. ctx.RenderWithErr(err.Error(), tplModelArtsIndex, nil)
  166. return
  167. }
  168. urls := strings.Split(result.Spec.Annotations.Url, "/")
  169. urlPrefix := result.Spec.Annotations.TargetDomain
  170. for i, url := range urls {
  171. if i > 2 {
  172. urlPrefix += "/" + url
  173. }
  174. }
  175. //urlPrefix := result.Spec.Annotations.TargetDomain + "/modelarts/internal/hub/notebook/user/" + task.JobID
  176. log.Info(urlPrefix)
  177. debugUrl := urlPrefix + "?token=" + res.Token
  178. ctx.Redirect(debugUrl)
  179. }
  180. func ModelArtsStop(ctx *context.Context) {
  181. var jobID = ctx.Params(":jobid")
  182. log.Info(jobID)
  183. task, err := models.GetCloudbrainByJobID(jobID)
  184. if err != nil {
  185. ctx.ServerError("GetCloudbrainByJobID failed", err)
  186. return
  187. }
  188. if task.Status != string(models.JobRunning) {
  189. log.Error("the job(%s) is not running", task.JobName)
  190. ctx.ServerError("the job is not running", errors.New("the job is not running"))
  191. return
  192. }
  193. param := models.NotebookAction{
  194. Action: models.ActionStop,
  195. }
  196. res, err := modelarts.StopJob(jobID, param)
  197. if err != nil {
  198. log.Error("StopJob(%s) failed:%v", task.JobName, err.Error())
  199. ctx.ServerError("StopJob failed", err)
  200. return
  201. }
  202. task.Status = res.CurrentStatus
  203. err = models.UpdateJob(task)
  204. if err != nil {
  205. ctx.ServerError("UpdateJob failed", err)
  206. return
  207. }
  208. ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/modelarts")
  209. }
  210. func ModelArtsDel(ctx *context.Context) {
  211. var jobID = ctx.Params(":jobid")
  212. task, err := models.GetCloudbrainByJobID(jobID)
  213. if err != nil {
  214. ctx.ServerError("GetCloudbrainByJobID failed", err)
  215. return
  216. }
  217. if task.Status != string(models.ModelArtsCreateFailed) && task.Status != string(models.ModelArtsStartFailed) && task.Status != string(models.ModelArtsStopped) {
  218. log.Error("the job(%s) has not been stopped", task.JobName)
  219. ctx.ServerError("the job has not been stopped", errors.New("the job has not been stopped"))
  220. return
  221. }
  222. _, err = modelarts.DelJob(jobID)
  223. if err != nil {
  224. log.Error("DelJob(%s) failed:%v", task.JobName, err.Error())
  225. ctx.ServerError("DelJob failed", err)
  226. return
  227. }
  228. err = models.DeleteJob(task)
  229. if err != nil {
  230. ctx.ServerError("DeleteJob failed", err)
  231. return
  232. }
  233. ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/modelarts")
  234. }
  235. func NotebookIndex(ctx *context.Context) {
  236. MustEnableModelArts(ctx)
  237. repo := ctx.Repo.Repository
  238. page := ctx.QueryInt("page")
  239. if page <= 0 {
  240. page = 1
  241. }
  242. ciTasks, count, err := models.Cloudbrains(&models.CloudbrainsOptions{
  243. ListOptions: models.ListOptions{
  244. Page: page,
  245. PageSize: setting.UI.IssuePagingNum,
  246. },
  247. RepoID: repo.ID,
  248. Type: models.TypeCloudBrainTwo,
  249. JobType: string(models.JobTypeDebug),
  250. })
  251. if err != nil {
  252. ctx.ServerError("Cloudbrain", err)
  253. return
  254. }
  255. for i, task := range ciTasks {
  256. if task.Status == string(models.JobRunning) {
  257. ciTasks[i].CanDebug = true
  258. } else {
  259. ciTasks[i].CanDebug = false
  260. }
  261. }
  262. pager := context.NewPagination(int(count), setting.UI.IssuePagingNum, page, 5)
  263. pager.SetDefaultParams(ctx)
  264. ctx.Data["Page"] = pager
  265. ctx.Data["PageIsCloudBrain"] = true
  266. ctx.Data["Tasks"] = ciTasks
  267. ctx.HTML(200, tplModelArtsNotebookIndex)
  268. }
  269. func NotebookNew(ctx *context.Context) {
  270. ctx.Data["PageIsCloudBrain"] = true
  271. t := time.Now()
  272. var jobName = jobNamePrefixValid(cutString(ctx.User.Name, 5)) + t.Format("2006010215") + strconv.Itoa(int(t.Unix()))[5:]
  273. ctx.Data["job_name"] = jobName
  274. attachs, err := models.GetModelArtsUserAttachments(ctx.User.ID)
  275. if err != nil {
  276. ctx.ServerError("GetAllUserAttachments failed:", err)
  277. return
  278. }
  279. ctx.Data["attachments"] = attachs
  280. ctx.Data["dataset_path"] = modelarts.DataSetMountPath
  281. ctx.Data["env"] = modelarts.NotebookEnv
  282. ctx.Data["notebook_type"] = modelarts.NotebookType
  283. if modelarts.FlavorInfos == nil {
  284. json.Unmarshal([]byte(setting.FlavorInfos), &modelarts.FlavorInfos)
  285. }
  286. ctx.Data["flavors"] = modelarts.FlavorInfos.FlavorInfo
  287. ctx.HTML(200, tplModelArtsNotebookNew)
  288. }
  289. func NotebookCreate(ctx *context.Context, form auth.CreateModelArtsNotebookForm) {
  290. ctx.Data["PageIsNotebook"] = true
  291. jobName := form.JobName
  292. uuid := form.Attachment
  293. description := form.Description
  294. err := modelarts.GenerateTask(ctx, jobName, uuid, description)
  295. if err != nil {
  296. ctx.RenderWithErr(err.Error(), tplModelArtsNotebookNew, &form)
  297. return
  298. }
  299. ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/modelarts/notebook")
  300. }
  301. func NotebookShow(ctx *context.Context) {
  302. ctx.Data["PageIsCloudBrain"] = true
  303. var jobID = ctx.Params(":jobid")
  304. task, err := models.GetCloudbrainByJobID(jobID)
  305. if err != nil {
  306. ctx.Data["error"] = err.Error()
  307. ctx.RenderWithErr(err.Error(), tplModelArtsNotebookShow, nil)
  308. return
  309. }
  310. result, err := modelarts.GetJob(jobID)
  311. if err != nil {
  312. ctx.Data["error"] = err.Error()
  313. ctx.RenderWithErr(err.Error(), tplModelArtsNotebookShow, nil)
  314. return
  315. }
  316. if result != nil {
  317. task.Status = result.Status
  318. err = models.UpdateJob(task)
  319. if err != nil {
  320. ctx.Data["error"] = err.Error()
  321. ctx.RenderWithErr(err.Error(), tplModelArtsNotebookShow, nil)
  322. return
  323. }
  324. createTime, _ := com.StrTo(result.CreationTimestamp).Int64()
  325. result.CreateTime = time.Unix(int64(createTime/1000), 0).Format("2006-01-02 15:04:05")
  326. endTime, _ := com.StrTo(result.LatestUpdateTimestamp).Int64()
  327. result.LatestUpdateTime = time.Unix(int64(endTime/1000), 0).Format("2006-01-02 15:04:05")
  328. result.QueuingInfo.BeginTime = time.Unix(int64(result.QueuingInfo.BeginTimestamp/1000), 0).Format("2006-01-02 15:04:05")
  329. result.QueuingInfo.EndTime = time.Unix(int64(result.QueuingInfo.EndTimestamp/1000), 0).Format("2006-01-02 15:04:05")
  330. }
  331. ctx.Data["task"] = task
  332. ctx.Data["jobID"] = jobID
  333. ctx.Data["result"] = result
  334. ctx.HTML(200, tplModelArtsNotebookShow)
  335. }
  336. func NotebookDebug(ctx *context.Context) {
  337. var jobID = ctx.Params(":jobid")
  338. _, err := models.GetCloudbrainByJobID(jobID)
  339. if err != nil {
  340. ctx.ServerError("GetCloudbrainByJobID failed", err)
  341. return
  342. }
  343. result, err := modelarts.GetJob(jobID)
  344. if err != nil {
  345. ctx.RenderWithErr(err.Error(), tplModelArtsNotebookIndex, nil)
  346. return
  347. }
  348. res, err := modelarts.GetJobToken(jobID)
  349. if err != nil {
  350. ctx.RenderWithErr(err.Error(), tplModelArtsNotebookIndex, nil)
  351. return
  352. }
  353. urls := strings.Split(result.Spec.Annotations.Url, "/")
  354. urlPrefix := result.Spec.Annotations.TargetDomain
  355. for i, url := range urls {
  356. if i > 2 {
  357. urlPrefix += "/" + url
  358. }
  359. }
  360. debugUrl := urlPrefix + "?token=" + res.Token
  361. ctx.Redirect(debugUrl)
  362. }
  363. func NotebookStop(ctx *context.Context) {
  364. var jobID = ctx.Params(":jobid")
  365. log.Info(jobID)
  366. task, err := models.GetCloudbrainByJobID(jobID)
  367. if err != nil {
  368. ctx.ServerError("GetCloudbrainByJobID failed", err)
  369. return
  370. }
  371. if task.Status != string(models.JobRunning) {
  372. log.Error("the job(%s) is not running", task.JobName)
  373. ctx.ServerError("the job is not running", errors.New("the job is not running"))
  374. return
  375. }
  376. param := models.NotebookAction{
  377. Action: models.ActionStop,
  378. }
  379. res, err := modelarts.StopJob(jobID, param)
  380. if err != nil {
  381. log.Error("StopJob(%s) failed:%v", task.JobName, err.Error())
  382. ctx.ServerError("StopJob failed", err)
  383. return
  384. }
  385. task.Status = res.CurrentStatus
  386. err = models.UpdateJob(task)
  387. if err != nil {
  388. ctx.ServerError("UpdateJob failed", err)
  389. return
  390. }
  391. ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/modelarts/notebook")
  392. }
  393. func NotebookDel(ctx *context.Context) {
  394. var jobID = ctx.Params(":jobid")
  395. task, err := models.GetCloudbrainByJobID(jobID)
  396. if err != nil {
  397. ctx.ServerError("GetCloudbrainByJobID failed", err)
  398. return
  399. }
  400. if task.Status != string(models.JobStopped) {
  401. log.Error("the job(%s) has not been stopped", task.JobName)
  402. ctx.ServerError("the job has not been stopped", errors.New("the job has not been stopped"))
  403. return
  404. }
  405. _, err = modelarts.DelNotebook(jobID)
  406. if err != nil {
  407. log.Error("DelJob(%s) failed:%v", task.JobName, err.Error())
  408. ctx.ServerError("DelJob failed", err)
  409. return
  410. }
  411. err = models.DeleteJob(task)
  412. if err != nil {
  413. ctx.ServerError("DeleteJob failed", err)
  414. return
  415. }
  416. ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/modelarts/notebook")
  417. }
  418. func TrainJobIndex(ctx *context.Context) {
  419. MustEnableModelArts(ctx)
  420. //can, err := canUserCreateTrainJob(ctx.User.ID)
  421. //if err != nil {
  422. // ctx.ServerError("canUserCreateTrainJob", err)
  423. // return
  424. //}
  425. //
  426. //ctx.Data["CanCreate"] = can
  427. repo := ctx.Repo.Repository
  428. page := ctx.QueryInt("page")
  429. if page <= 0 {
  430. page = 1
  431. }
  432. tasks, count, err := models.Cloudbrains(&models.CloudbrainsOptions{
  433. ListOptions: models.ListOptions{
  434. Page: page,
  435. PageSize: setting.UI.IssuePagingNum,
  436. },
  437. RepoID: repo.ID,
  438. Type: models.TypeCloudBrainTwo,
  439. JobType: string(models.JobTypeTrain),
  440. })
  441. if err != nil {
  442. ctx.ServerError("Cloudbrain", err)
  443. return
  444. }
  445. pager := context.NewPagination(int(count), setting.UI.IssuePagingNum, page, 5)
  446. pager.SetDefaultParams(ctx)
  447. ctx.Data["Page"] = pager
  448. ctx.Data["PageIsCloudBrain"] = true
  449. ctx.Data["Tasks"] = tasks
  450. ctx.HTML(200, tplModelArtsTrainJobIndex)
  451. }
  452. func TrainJobNew(ctx *context.Context) {
  453. err := trainJobNewDataPrepare(ctx)
  454. if err != nil {
  455. ctx.ServerError("get new train-job info failed", err)
  456. return
  457. }
  458. ctx.HTML(200, tplModelArtsTrainJobNew)
  459. }
  460. func trainJobNewDataPrepare(ctx *context.Context) error {
  461. ctx.Data["PageIsCloudBrain"] = true
  462. //can, err := canUserCreateTrainJob(ctx.User.ID)
  463. //if err != nil {
  464. // ctx.ServerError("canUserCreateTrainJob", err)
  465. // return
  466. //}
  467. //
  468. //if !can {
  469. // log.Error("the user can not create train-job")
  470. // ctx.ServerError("the user can not create train-job", fmt.Errorf("the user can not create train-job"))
  471. // return
  472. //}
  473. t := time.Now()
  474. var jobName = cutString(ctx.User.Name, 5) + t.Format("2006010215") + strconv.Itoa(int(t.Unix()))[5:]
  475. ctx.Data["job_name"] = jobName
  476. attachs, err := models.GetModelArtsUserAttachments(ctx.User.ID)
  477. if err != nil {
  478. ctx.ServerError("GetAllUserAttachments failed:", err)
  479. return err
  480. }
  481. ctx.Data["attachments"] = attachs
  482. var resourcePools modelarts.ResourcePool
  483. if err = json.Unmarshal([]byte(setting.ResourcePools), &resourcePools); err != nil {
  484. ctx.ServerError("json.Unmarshal failed:", err)
  485. return err
  486. }
  487. ctx.Data["resource_pools"] = resourcePools.Info
  488. var engines modelarts.Engine
  489. if err = json.Unmarshal([]byte(setting.Engines), &engines); err != nil {
  490. ctx.ServerError("json.Unmarshal failed:", err)
  491. return err
  492. }
  493. ctx.Data["engines"] = engines.Info
  494. var versionInfos modelarts.VersionInfo
  495. if err = json.Unmarshal([]byte(setting.EngineVersions), &versionInfos); err != nil {
  496. ctx.ServerError("json.Unmarshal failed:", err)
  497. return err
  498. }
  499. ctx.Data["engine_versions"] = versionInfos.Version
  500. var flavorInfos modelarts.Flavor
  501. if err = json.Unmarshal([]byte(setting.TrainJobFLAVORINFOS), &flavorInfos); err != nil {
  502. ctx.ServerError("json.Unmarshal failed:", err)
  503. return err
  504. }
  505. ctx.Data["flavor_infos"] = flavorInfos.Info
  506. outputObsPath := "/" + setting.Bucket + modelarts.JobPath + jobName + modelarts.OutputPath
  507. ctx.Data["train_url"] = outputObsPath
  508. configList, err := getConfigList(modelarts.PerPage, 1, modelarts.SortByCreateTime, "desc", "", modelarts.ConfigTypeCustom)
  509. if err != nil {
  510. ctx.ServerError("getConfigList failed:", err)
  511. return err
  512. }
  513. ctx.Data["config_list"] = configList.ParaConfigs
  514. return nil
  515. }
  516. func TrainJobCreate(ctx *context.Context, form auth.CreateModelArtsTrainJobForm) {
  517. ctx.Data["PageIsTrainJob"] = true
  518. jobName := form.JobName
  519. uuid := form.Attachment
  520. description := form.Description
  521. workServerNumber := form.WorkServerNumber
  522. engineID := form.EngineID
  523. bootFile := form.BootFile
  524. flavorCode := form.Flavor
  525. params := form.Params
  526. poolID := form.PoolID
  527. isSaveParam := form.IsSaveParam
  528. repo := ctx.Repo.Repository
  529. codeLocalPath := setting.JobPath + jobName + modelarts.CodePath
  530. codeObsPath := "/" + setting.Bucket + modelarts.JobPath + jobName + modelarts.CodePath
  531. outputObsPath := "/" + setting.Bucket + modelarts.JobPath + jobName + modelarts.OutputPath
  532. logObsPath := "/" + setting.Bucket + modelarts.JobPath + jobName + modelarts.LogPath
  533. dataPath := "/" + setting.Bucket + "/" + setting.BasePath + path.Join(uuid[0:1], uuid[1:2]) + "/" + uuid + uuid + "/"
  534. //can, err := canUserCreateTrainJob(ctx.User.ID)
  535. //if err != nil {
  536. // ctx.ServerError("canUserCreateTrainJob", err)
  537. // return
  538. //}
  539. //
  540. //if !can {
  541. // log.Error("the user can not create train-job")
  542. // ctx.RenderWithErr("the user can not create train-job", tplModelArtsTrainJobNew, &form)
  543. // return
  544. //}
  545. //param check
  546. if err := paramCheckCreateTrainJob(form); err != nil {
  547. log.Error("paramCheckCreateTrainJob failed:(%v)", err)
  548. trainJobNewDataPrepare(ctx)
  549. ctx.RenderWithErr(err.Error(), tplModelArtsTrainJobNew, &form)
  550. return
  551. }
  552. attach, err := models.GetAttachmentByUUID(uuid)
  553. if err != nil {
  554. log.Error("GetAttachmentByUUID(%s) failed:%v", uuid, err.Error())
  555. return
  556. }
  557. //todo: del the codeLocalPath
  558. _, err = ioutil.ReadDir(codeLocalPath)
  559. if err == nil {
  560. os.RemoveAll(codeLocalPath)
  561. }
  562. if err := git.Clone(repo.RepoPath(), codeLocalPath, git.CloneRepoOptions{}); err != nil {
  563. log.Error("创建任务失败,任务名称已存在!: %s (%v)", repo.FullName(), err)
  564. trainJobNewDataPrepare(ctx)
  565. ctx.Data["bootFile"] = form.BootFile
  566. ctx.Data["uuid"] = form.Attachment
  567. ctx.Data["datasetName"] = attach.Name
  568. ctx.Data["params"] = form.Params
  569. trainJobNewDataPrepare(ctx)
  570. // ctx.RenderWithErr("Failed to clone repository", tplModelArtsTrainJobNew, &form)
  571. ctx.RenderWithErr("创建任务失败,任务名称已存在!", tplModelArtsTrainJobNew, &form)
  572. // ctx.RenderWithErr(err, tplModelArtsTrainJobNew, &form)
  573. return
  574. }
  575. //todo: upload code (send to file_server todo this work?)
  576. if err := obsMkdir(setting.CodePathPrefix + jobName + modelarts.OutputPath); err != nil {
  577. log.Error("Failed to obsMkdir_output: %s (%v)", repo.FullName(), err)
  578. trainJobNewDataPrepare(ctx)
  579. ctx.RenderWithErr("Failed to obsMkdir_output", tplModelArtsTrainJobNew, &form)
  580. return
  581. }
  582. if err := obsMkdir(setting.CodePathPrefix + jobName + modelarts.LogPath); err != nil {
  583. log.Error("Failed to obsMkdir_log: %s (%v)", repo.FullName(), err)
  584. trainJobNewDataPrepare(ctx)
  585. ctx.RenderWithErr("Failed to obsMkdir_log", tplModelArtsTrainJobNew, &form)
  586. return
  587. }
  588. if err := uploadCodeToObs(codeLocalPath, jobName, ""); err != nil {
  589. log.Error("Failed to uploadCodeToObs: %s (%v)", repo.FullName(), err)
  590. trainJobNewDataPrepare(ctx)
  591. ctx.RenderWithErr("Failed to uploadCodeToObs", tplModelArtsTrainJobNew, &form)
  592. return
  593. }
  594. //todo: del local code?
  595. var parameters models.Parameters
  596. param := make([]models.Parameter, 0)
  597. param = append(param, models.Parameter{
  598. Label: modelarts.TrainUrl,
  599. Value: outputObsPath,
  600. }, models.Parameter{
  601. Label: modelarts.DataUrl,
  602. Value: dataPath,
  603. })
  604. if len(params) != 0 {
  605. err := json.Unmarshal([]byte(params), &parameters)
  606. if err != nil {
  607. log.Error("Failed to Unmarshal params: %s (%v)", params, err)
  608. trainJobNewDataPrepare(ctx)
  609. ctx.RenderWithErr("运行参数错误", tplModelArtsTrainJobNew, &form)
  610. return
  611. }
  612. for _, parameter := range parameters.Parameter {
  613. if parameter.Label != modelarts.TrainUrl && parameter.Label != modelarts.DataUrl {
  614. param = append(param, models.Parameter{
  615. Label: parameter.Label,
  616. Value: parameter.Value,
  617. })
  618. }
  619. }
  620. }
  621. //save param config
  622. if isSaveParam == "on" {
  623. if form.ParameterTemplateName == "" {
  624. log.Error("ParameterTemplateName is empty")
  625. trainJobNewDataPrepare(ctx)
  626. ctx.RenderWithErr("保存作业参数时,作业参数名称不能为空", tplModelArtsTrainJobNew, &form)
  627. return
  628. }
  629. _, err := modelarts.CreateTrainJobConfig(models.CreateConfigParams{
  630. ConfigName: form.ParameterTemplateName,
  631. Description: form.PrameterDescription,
  632. DataUrl: dataPath,
  633. AppUrl: codeObsPath,
  634. BootFileUrl: codeObsPath + bootFile,
  635. TrainUrl: outputObsPath,
  636. Flavor: models.Flavor{
  637. Code: flavorCode,
  638. },
  639. WorkServerNum: workServerNumber,
  640. EngineID: int64(engineID),
  641. LogUrl: logObsPath,
  642. PoolID: poolID,
  643. Parameter: param,
  644. })
  645. if err != nil {
  646. log.Error("Failed to CreateTrainJobConfig: %v", err)
  647. trainJobNewDataPrepare(ctx)
  648. ctx.RenderWithErr("保存作业参数失败:"+err.Error(), tplModelArtsTrainJobNew, &form)
  649. return
  650. }
  651. }
  652. req := &modelarts.GenerateTrainJobReq{
  653. JobName: jobName,
  654. DataUrl: dataPath,
  655. Description: description,
  656. CodeObsPath: codeObsPath,
  657. BootFile: codeObsPath + bootFile,
  658. TrainUrl: outputObsPath,
  659. FlavorCode: flavorCode,
  660. WorkServerNumber: workServerNumber,
  661. EngineID: int64(engineID),
  662. LogUrl: logObsPath,
  663. PoolID: poolID,
  664. Uuid: uuid,
  665. Parameters: param,
  666. }
  667. err = modelarts.GenerateTrainJob(ctx, req)
  668. if err != nil {
  669. log.Error("GenerateTrainJob failed:%v", err.Error())
  670. trainJobNewDataPrepare(ctx)
  671. ctx.Data["bootFile"] = form.BootFile
  672. ctx.Data["uuid"] = form.Attachment
  673. ctx.Data["datasetName"] = attach.Name
  674. ctx.Data["params"] = form.Params
  675. ctx.RenderWithErr(err.Error(), tplModelArtsTrainJobNew, &form)
  676. return
  677. }
  678. ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/modelarts/train-job")
  679. }
  680. // readDir reads the directory named by dirname and returns
  681. // a list of directory entries sorted by filename.
  682. func readDir(dirname string) ([]os.FileInfo, error) {
  683. f, err := os.Open(dirname)
  684. if err != nil {
  685. return nil, err
  686. }
  687. list, err := f.Readdir(100)
  688. f.Close()
  689. if err != nil {
  690. //todo: can not upload empty folder
  691. if err == io.EOF {
  692. return nil, nil
  693. }
  694. return nil, err
  695. }
  696. //sort.Slice(list, func(i, j int) bool { return list[i].Name() < list[j].Name() })
  697. return list, nil
  698. }
  699. func uploadCodeToObs(codePath, jobName, parentDir string) error {
  700. files, err := readDir(codePath)
  701. if err != nil {
  702. log.Error("readDir(%s) failed: %s", codePath, err.Error())
  703. return err
  704. }
  705. for _, file := range files {
  706. if file.IsDir() {
  707. input := &obs.PutObjectInput{}
  708. input.Bucket = setting.Bucket
  709. input.Key = parentDir + file.Name() + "/"
  710. _, err = storage.ObsCli.PutObject(input)
  711. if err != nil {
  712. log.Error("PutObject(%s) failed: %s", input.Key, err.Error())
  713. return err
  714. }
  715. if err = uploadCodeToObs(codePath+file.Name()+"/", jobName, parentDir+file.Name()+"/"); err != nil {
  716. log.Error("uploadCodeToObs(%s) failed: %s", file.Name(), err.Error())
  717. return err
  718. }
  719. } else {
  720. input := &obs.PutFileInput{}
  721. input.Bucket = setting.Bucket
  722. input.Key = setting.CodePathPrefix + jobName + "/code/" + parentDir + file.Name()
  723. input.SourceFile = codePath + file.Name()
  724. _, err = storage.ObsCli.PutFile(input)
  725. if err != nil {
  726. log.Error("PutFile(%s) failed: %s", input.SourceFile, err.Error())
  727. return err
  728. }
  729. }
  730. }
  731. return nil
  732. }
  733. func obsMkdir(dir string) error {
  734. input := &obs.PutObjectInput{}
  735. input.Bucket = setting.Bucket
  736. input.Key = dir
  737. _, err := storage.ObsCli.PutObject(input)
  738. if err != nil {
  739. log.Error("PutObject(%s) failed: %s", input.Key, err.Error())
  740. return err
  741. }
  742. return nil
  743. }
  744. func paramCheckCreateTrainJob(form auth.CreateModelArtsTrainJobForm) error {
  745. if !strings.HasSuffix(form.BootFile, ".py") {
  746. log.Error("the boot file(%s) must be a python file", form.BootFile)
  747. return errors.New("启动文件必须是python文件")
  748. }
  749. if form.WorkServerNumber > 25 || form.WorkServerNumber < 1 {
  750. log.Error("the WorkServerNumber(%d) must be in (1,25)", form.WorkServerNumber)
  751. return errors.New("计算节点数必须在1-25之间")
  752. }
  753. return nil
  754. }
  755. func TrainJobShow(ctx *context.Context) {
  756. ctx.Data["PageIsCloudBrain"] = true
  757. var jobID = ctx.Params(":jobid")
  758. task, err := models.GetCloudbrainByJobID(jobID)
  759. if err != nil {
  760. log.Error("GetCloudbrainByJobID(%s) failed:%v", jobID, err.Error())
  761. ctx.RenderWithErr(err.Error(), tplModelArtsTrainJobShow, nil)
  762. return
  763. }
  764. // attach, err := models.GetAttachmentByUUID(task.Uuid)
  765. // if err != nil {
  766. // log.Error("GetAttachmentByUUID(%s) failed:%v", jobID, err.Error())
  767. // ctx.RenderWithErr(err.Error(), tplModelArtsTrainJobShow, nil)
  768. // return
  769. // }
  770. result, err := modelarts.GetTrainJob(jobID, strconv.FormatInt(task.VersionID, 10))
  771. if err != nil {
  772. log.Error("GetJob(%s) failed:%v", jobID, err.Error())
  773. ctx.RenderWithErr(err.Error(), tplModelArtsTrainJobShow, nil)
  774. return
  775. }
  776. if result != nil {
  777. result.CreateTime = time.Unix(int64(result.LongCreateTime/1000), 0).Format("2006-01-02 15:04:05")
  778. if result.Duration != 0 {
  779. result.TrainJobDuration = addZero(result.Duration/3600000) + ":" + addZero(result.Duration%3600000/60000) + ":" + addZero(result.Duration%60000/1000)
  780. } else {
  781. result.TrainJobDuration = "00:00:00"
  782. }
  783. result.Status = modelarts.TransTrainJobStatus(result.IntStatus)
  784. err = models.SetTrainJobStatusByJobID(jobID, result.Status, result.Duration, string(result.TrainJobDuration))
  785. if err != nil {
  786. ctx.ServerError("UpdateJob failed", err)
  787. return
  788. }
  789. result.DatasetName = task.DatasetName
  790. }
  791. resultLogFile, resultLog, err := trainJobGetLog(jobID)
  792. if err != nil {
  793. log.Error("trainJobGetLog(%s) failed:%v", jobID, err.Error())
  794. ctx.RenderWithErr(err.Error(), tplModelArtsTrainJobShow, nil)
  795. return
  796. }
  797. ctx.Data["log_file_name"] = resultLogFile.LogFileList[0]
  798. ctx.Data["log"] = resultLog
  799. ctx.Data["task"] = task
  800. ctx.Data["jobID"] = jobID
  801. ctx.Data["result"] = result
  802. ctx.HTML(http.StatusOK, tplModelArtsTrainJobShow)
  803. }
  804. func addZero(t int64) (m string) {
  805. if t < 10 {
  806. m = "0" + strconv.FormatInt(t, 10)
  807. return m
  808. } else {
  809. return strconv.FormatInt(t, 10)
  810. }
  811. }
  812. func TrainJobGetLog(ctx *context.Context) {
  813. ctx.Data["PageIsTrainJob"] = true
  814. var jobID = ctx.Params(":jobid")
  815. var logFileName = ctx.Query("file_name")
  816. var baseLine = ctx.Query("base_line")
  817. var order = ctx.Query("order")
  818. if order != modelarts.OrderDesc && order != modelarts.OrderAsc {
  819. log.Error("order(%s) check failed", order)
  820. ctx.HTML(http.StatusBadRequest, tplModelArtsTrainJobShow)
  821. return
  822. }
  823. task, err := models.GetCloudbrainByJobID(jobID)
  824. if err != nil {
  825. log.Error("GetCloudbrainByJobID(%s) failed:%v", jobID, err.Error())
  826. ctx.RenderWithErr(err.Error(), tplModelArtsTrainJobShow, nil)
  827. return
  828. }
  829. result, err := modelarts.GetTrainJobLog(jobID, strconv.FormatInt(task.VersionID, 10), baseLine, logFileName, order, modelarts.Lines)
  830. if err != nil {
  831. log.Error("GetTrainJobLog(%s) failed:%v", jobID, err.Error())
  832. ctx.RenderWithErr(err.Error(), tplModelArtsTrainJobShow, nil)
  833. return
  834. }
  835. ctx.Data["log"] = result
  836. //ctx.HTML(http.StatusOK, tplModelArtsTrainJobShow)
  837. }
  838. func trainJobGetLog(jobID string) (*models.GetTrainJobLogFileNamesResult, *models.GetTrainJobLogResult, error) {
  839. task, err := models.GetCloudbrainByJobID(jobID)
  840. if err != nil {
  841. log.Error("GetCloudbrainByJobID(%s) failed:%v", jobID, err.Error())
  842. return nil, nil, err
  843. }
  844. resultLogFile, err := modelarts.GetTrainJobLogFileNames(jobID, strconv.FormatInt(task.VersionID, 10))
  845. if err != nil {
  846. log.Error("GetTrainJobLogFileNames(%s) failed:%v", jobID, err.Error())
  847. return nil, nil, err
  848. }
  849. result, err := modelarts.GetTrainJobLog(jobID, strconv.FormatInt(task.VersionID, 10), "", resultLogFile.LogFileList[0], modelarts.OrderDesc, modelarts.Lines)
  850. if err != nil {
  851. log.Error("GetTrainJobLog(%s) failed:%v", jobID, err.Error())
  852. return nil, nil, err
  853. }
  854. return resultLogFile, result, err
  855. }
  856. func TrainJobDel(ctx *context.Context) {
  857. var jobID = ctx.Params(":jobid")
  858. task, err := models.GetCloudbrainByJobID(jobID)
  859. if err != nil {
  860. log.Error("GetCloudbrainByJobID(%s) failed:%v", task.JobName, err.Error())
  861. ctx.RenderWithErr(err.Error(), tplModelArtsTrainJobIndex, nil)
  862. return
  863. }
  864. _, err = modelarts.DelTrainJob(jobID)
  865. if err != nil {
  866. log.Error("DelTrainJob(%s) failed:%v", task.JobName, err.Error())
  867. ctx.RenderWithErr(err.Error(), tplModelArtsTrainJobIndex, nil)
  868. return
  869. }
  870. err = models.DeleteJob(task)
  871. if err != nil {
  872. ctx.ServerError("DeleteJob failed", err)
  873. return
  874. }
  875. ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/modelarts/train-job")
  876. }
  877. func TrainJobStop(ctx *context.Context) {
  878. var jobID = ctx.Params(":jobid")
  879. task, err := models.GetCloudbrainByJobID(jobID)
  880. if err != nil {
  881. log.Error("GetCloudbrainByJobID(%s) failed:%v", task.JobName, err.Error())
  882. ctx.RenderWithErr(err.Error(), tplModelArtsTrainJobIndex, nil)
  883. return
  884. }
  885. _, err = modelarts.StopTrainJob(jobID, strconv.FormatInt(task.VersionID, 10))
  886. if err != nil {
  887. log.Error("StopTrainJob(%s) failed:%v", task.JobName, err.Error())
  888. ctx.RenderWithErr(err.Error(), tplModelArtsTrainJobIndex, nil)
  889. return
  890. }
  891. ctx.Redirect(setting.AppSubURL + ctx.Repo.RepoLink + "/modelarts/train-job")
  892. }
  893. func canUserCreateTrainJob(uid int64) (bool, error) {
  894. org, err := models.GetOrgByName(setting.AllowedOrg)
  895. if err != nil {
  896. log.Error("get allowed org failed: ", setting.AllowedOrg)
  897. return false, err
  898. }
  899. return org.IsOrgMember(uid)
  900. }
  901. func TrainJobGetConfigList(ctx *context.Context) {
  902. ctx.Data["PageIsTrainJob"] = true
  903. var jobID = ctx.Params(":jobid")
  904. var logFileName = ctx.Query("file_name")
  905. var baseLine = ctx.Query("base_line")
  906. var order = ctx.Query("order")
  907. if order != modelarts.OrderDesc && order != modelarts.OrderAsc {
  908. log.Error("order(%s) check failed", order)
  909. ctx.HTML(http.StatusBadRequest, tplModelArtsTrainJobShow)
  910. return
  911. }
  912. task, err := models.GetCloudbrainByJobID(jobID)
  913. if err != nil {
  914. log.Error("GetCloudbrainByJobID(%s) failed:%v", jobID, err.Error())
  915. ctx.RenderWithErr(err.Error(), tplModelArtsTrainJobShow, nil)
  916. return
  917. }
  918. result, err := modelarts.GetTrainJobLog(jobID, strconv.FormatInt(task.VersionID, 10), baseLine, logFileName, order, modelarts.Lines)
  919. if err != nil {
  920. log.Error("GetTrainJobLog(%s) failed:%v", jobID, err.Error())
  921. ctx.RenderWithErr(err.Error(), tplModelArtsTrainJobShow, nil)
  922. return
  923. }
  924. ctx.Data["log"] = result
  925. //ctx.HTML(http.StatusOK, tplModelArtsTrainJobShow)
  926. }
  927. func getConfigList(perPage, page int, sortBy, order, searchContent, configType string) (*models.GetConfigListResult, error) {
  928. var result models.GetConfigListResult
  929. list, err := modelarts.GetConfigList(perPage, page, sortBy, order, searchContent, configType)
  930. if err != nil {
  931. log.Error("GetConfigList failed:", err)
  932. return &result, err
  933. }
  934. for _, config := range list.ParaConfigs {
  935. paraConfig, err := modelarts.GetParaConfig(config.ConfigName, configType)
  936. if err != nil {
  937. log.Error("GetParaConfig failed:", err)
  938. return &result, err
  939. }
  940. config.Result = paraConfig
  941. }
  942. return list, nil
  943. }
  944. func TrainJobShowModels(ctx *context.Context) {
  945. ctx.Data["PageIsCloudBrain"] = true
  946. jobID := ctx.Params(":jobid")
  947. parentDir := ctx.Query("parentDir")
  948. dirArray := strings.Split(parentDir, "/")
  949. task, err := models.GetCloudbrainByJobID(jobID)
  950. if err != nil {
  951. log.Error("no such job!", ctx.Data["msgID"])
  952. ctx.ServerError("no such job:", err)
  953. return
  954. }
  955. models, err := storage.GetObsListObject(task.JobName, parentDir)
  956. if err != nil {
  957. log.Info("get TrainJobListModel failed:", err)
  958. ctx.ServerError("GetObsListObject:", err)
  959. return
  960. }
  961. ctx.Data["Path"] = dirArray
  962. ctx.Data["Dirs"] = models
  963. ctx.Data["task"] = task
  964. ctx.Data["JobID"] = jobID
  965. ctx.HTML(200, tplModelArtsTrainJobShowModels)
  966. }
  967. func TrainJobDownloadModel(ctx *context.Context) {
  968. parentDir := ctx.Query("parentDir")
  969. fileName := ctx.Query("fileName")
  970. jobName := ctx.Query("jobName")
  971. url, err := storage.GetObsCreateSignedUrl(jobName, parentDir, fileName)
  972. if err != nil {
  973. log.Error("GetObsCreateSignedUrl failed: %v", err.Error(), ctx.Data["msgID"])
  974. ctx.ServerError("GetObsCreateSignedUrl", err)
  975. return
  976. }
  977. http.Redirect(ctx.Resp, ctx.Req.Request, url, http.StatusMovedPermanently)
  978. }