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

3 years ago
2 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
2 years ago
3 years ago
2 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
4 years ago
3 years ago
4 years ago
4 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
2 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
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
3 years ago
2 years ago
2 years ago
2 years ago
3 years ago
2 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
2 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 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
2 years ago
4 years ago
4 years ago
4 years ago
4 years ago
2 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
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
4 years ago
4 years ago
3 years ago
2 years ago
3 years ago
3 years ago
4 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
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
3 years ago
2 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
2 years ago
4 years ago
4 years ago
2 years ago
3 years ago
4 years ago
3 years ago
2 years ago
4 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
4 years ago
2 years ago
3 years ago
2 years ago
2 years ago
4 years ago
3 years ago
2 years ago
4 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
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
2 years ago
2 years ago
3 years ago
2 years ago
2 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
3 years ago
3 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
2 years ago
2 years ago
2 years ago
3 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
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
2 years ago
3 years ago
2 years ago
3 years ago
4 years ago
3 years ago
3 years ago
4 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
2 years ago
2 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
3 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
3 years ago
3 years ago
2 years ago
4 years ago
4 years ago
2 years ago
4 years ago
3 years ago
2 years ago
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
3 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
3 years ago
2 years ago
3 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
3 years ago
2 years ago
3 years ago
2 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
2 years ago
2 years ago
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
2 years ago
3 years ago
2 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
2 years ago
2 years ago
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
2 years ago
3 years ago
3 years ago
3 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845
  1. package models
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "path"
  7. "strconv"
  8. "strings"
  9. "time"
  10. "code.gitea.io/gitea/modules/util"
  11. "xorm.io/builder"
  12. "xorm.io/xorm"
  13. "code.gitea.io/gitea/modules/log"
  14. "code.gitea.io/gitea/modules/setting"
  15. "code.gitea.io/gitea/modules/timeutil"
  16. )
  17. type CloudbrainStatus string
  18. type JobType string
  19. type ModelArtsJobStatus string
  20. const (
  21. TypeCloudBrainOne int = iota
  22. TypeCloudBrainTwo
  23. TypeC2Net //智算网络
  24. TypeCDCenter //成都智算中心
  25. TypeCloudBrainAll = -1
  26. AccCardsNumAll = -1
  27. )
  28. const (
  29. NPUResource = "NPU"
  30. GPUResource = "CPU/GPU"
  31. GCUResource = "GCU"
  32. AllResource = "all"
  33. //notebook storage category
  34. EVSCategory = "EVS"
  35. EFSCategory = "EFS"
  36. ManagedOwnership = "MANAGED"
  37. DetectedOwnership = "DEDICATED"
  38. NotebookFeature = "NOTEBOOK"
  39. DefaultFeature = "DEFAULT"
  40. JobWaiting CloudbrainStatus = "WAITING"
  41. JobStopped CloudbrainStatus = "STOPPED"
  42. JobSucceeded CloudbrainStatus = "SUCCEEDED"
  43. JobFailed CloudbrainStatus = "FAILED"
  44. JobRunning CloudbrainStatus = "RUNNING"
  45. ModelSafetyTesting CloudbrainStatus = "TESTING"
  46. JobTypeDebug JobType = "DEBUG"
  47. JobTypeBenchmark JobType = "BENCHMARK"
  48. JobTypeModelSafety JobType = "MODELSAFETY"
  49. JobTypeSnn4imagenet JobType = "SNN4IMAGENET"
  50. JobTypeBrainScore JobType = "BRAINSCORE"
  51. JobTypeSnn4Ecoset JobType = "SNN4ECOSET"
  52. JobTypeTrain JobType = "TRAIN"
  53. JobTypeInference JobType = "INFERENCE"
  54. //notebook
  55. ModelArtsCreateQueue ModelArtsJobStatus = "CREATE_QUEUING" //免费资源创建排队中
  56. ModelArtsCreating ModelArtsJobStatus = "CREATING" //创建中
  57. ModelArtsCreateFailed ModelArtsJobStatus = "CREATE_FAILED" //创建失败
  58. ModelArtsStartQueuing ModelArtsJobStatus = "START_QUEUING" //免费资源启动排队中
  59. ModelArtsReadyToStart ModelArtsJobStatus = "READY_TO_START" //免费资源等待启动
  60. ModelArtsStarting ModelArtsJobStatus = "STARTING" //启动中
  61. ModelArtsRestarting ModelArtsJobStatus = "RESTARTING" //重启中
  62. ModelArtsStartFailed ModelArtsJobStatus = "START_FAILED" //启动失败
  63. ModelArtsRunning ModelArtsJobStatus = "RUNNING" //运行中
  64. ModelArtsStopping ModelArtsJobStatus = "STOPPING" //停止中
  65. ModelArtsStopped ModelArtsJobStatus = "STOPPED" //停止
  66. ModelArtsUnavailable ModelArtsJobStatus = "UNAVAILABLE" //故障
  67. ModelArtsDeleting ModelArtsJobStatus = "DELETING" //删除中
  68. ModelArtsDeleted ModelArtsJobStatus = "DELETED" //已删除
  69. ModelArtsResizing ModelArtsJobStatus = "RESIZING" //规格变更中
  70. ModelArtsResizFailed ModelArtsJobStatus = "RESIZE_FAILED" //规格变更失败
  71. //trainjob
  72. ModelArtsTrainJobUnknown ModelArtsJobStatus = "UNKNOWN" //作业状态未知
  73. ModelArtsTrainJobInit ModelArtsJobStatus = "INIT" //作业初始化状态
  74. ModelArtsTrainJobImageCreating ModelArtsJobStatus = "IMAGE_CREATING" //作业镜像正在创建
  75. ModelArtsTrainJobImageFailed ModelArtsJobStatus = "IMAGE_FAILED" //作业镜像创建失败
  76. ModelArtsTrainJobSubmitTrying ModelArtsJobStatus = "SUBMIT_TRYING" //作业正在提交
  77. ModelArtsTrainJobSubmitFailed ModelArtsJobStatus = "SUBMIT_FAILED" //作业提交失败
  78. ModelArtsTrainJobDeleteFailed ModelArtsJobStatus = "DELETE_FAILED" //作业删除失败
  79. ModelArtsTrainJobWaiting ModelArtsJobStatus = "WAITING" //作业正在排队中
  80. ModelArtsTrainJobRunning ModelArtsJobStatus = "RUNNING" //作业正在运行中
  81. ModelArtsTrainJobKilling ModelArtsJobStatus = "KILLING" //作业正在取消
  82. ModelArtsTrainJobCompleted ModelArtsJobStatus = "COMPLETED" //作业已经完成
  83. ModelArtsTrainJobFailed ModelArtsJobStatus = "FAILED" //作业运行失败
  84. ModelArtsTrainJobKilled ModelArtsJobStatus = "KILLED" //作业取消成功
  85. ModelArtsTrainJobCanceled ModelArtsJobStatus = "CANCELED" //作业取消
  86. ModelArtsTrainJobLost ModelArtsJobStatus = "LOST" //作业丢失
  87. ModelArtsTrainJobScaling ModelArtsJobStatus = "SCALING" //作业正在扩容
  88. ModelArtsTrainJobSubmitModelFailed ModelArtsJobStatus = "SUBMIT_MODEL_FAILED" //提交模型失败
  89. ModelArtsTrainJobDeployServiceFailed ModelArtsJobStatus = "DEPLOY_SERVICE_FAILED" //部署服务失败
  90. ModelArtsTrainJobCheckInit ModelArtsJobStatus = "CHECK_INIT" //审核作业初始化
  91. ModelArtsTrainJobCheckRunning ModelArtsJobStatus = "CHECK_RUNNING" //审核作业正在运行中
  92. ModelArtsTrainJobCheckRunningCompleted ModelArtsJobStatus = "CHECK_RUNNING_COMPLETED" //审核作业已经完成
  93. ModelArtsTrainJobCheckFailed ModelArtsJobStatus = "CHECK_FAILED" //审核作业失败
  94. DURATION_STR_ZERO = "00:00:00"
  95. CloudbrainKeyDuration = 24 * time.Hour
  96. //grampus
  97. GrampusStatusPending = "pending"
  98. GrampusStatusRunning = "RUNNING"
  99. GrampusStatusFailed = "FAILED"
  100. GrampusStatusSucceeded = "SUCCEEDED"
  101. GrampusStatusStopped = "STOPPED"
  102. GrampusStatusStopping = "STOPPING"
  103. GrampusStatusUnknown = "UNKNOWN"
  104. GrampusStatusWaiting = "WAITING"
  105. ModelSuffix = "models.zip"
  106. )
  107. const (
  108. //cluster
  109. OpenICluster = "OpenI"
  110. C2NetCluster = "C2Net"
  111. //AI center
  112. AICenterOfCloudBrainOne = "OpenIOne"
  113. AICenterOfCloudBrainTwo = "OpenITwo"
  114. AICenterOfChengdu = "OpenIChengdu"
  115. //ComputeResource
  116. GPU = "GPU"
  117. NPU = "NPU"
  118. GCU = "GCU"
  119. )
  120. const (
  121. AIModelPath = "aimodels/"
  122. )
  123. type Cloudbrain struct {
  124. ID int64 `xorm:"pk autoincr"`
  125. JobID string `xorm:"INDEX NOT NULL"`
  126. JobType string `xorm:"INDEX NOT NULL DEFAULT 'DEBUG'"`
  127. JobName string
  128. DisplayJobName string
  129. Status string
  130. UserID int64 `xorm:"INDEX NOT NULL"`
  131. RepoID int64 `xorm:"INDEX NOT NULL"`
  132. SubTaskName string
  133. ContainerID string
  134. ContainerIp string
  135. CreatedUnix timeutil.TimeStamp `xorm:"INDEX"`
  136. UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
  137. Duration int64 `xorm:"DEFAULT 0"` //运行时长 单位秒
  138. TrainJobDuration string `xorm:"DEFAULT '00:00:00'"`
  139. Image string //镜像名称
  140. GpuQueue string //GPU类型即GPU队列
  141. ResourceSpecId int //GPU规格id
  142. DeletedAt time.Time `xorm:"deleted"`
  143. CanDebug bool `xorm:"-"`
  144. CanDel bool `xorm:"-"`
  145. CanModify bool `xorm:"-"`
  146. Type int `xorm:"INDEX"`
  147. BenchmarkTypeID int
  148. BenchmarkChildTypeID int
  149. CardType string
  150. Cluster string
  151. VersionID int64 //版本id
  152. VersionName string `xorm:"INDEX"` //当前版本
  153. Uuid string //数据集id
  154. DatasetName string `xorm:"varchar(2000)"`
  155. VersionCount int //任务的当前版本数量,不包括删除的
  156. IsLatestVersion string //是否是最新版本,1是,0否
  157. CommitID string //提交的仓库代码id
  158. PreVersionName string //父版本名称
  159. ComputeResource string //计算资源,例如npu
  160. EngineID int64 //引擎id
  161. ImageID string //grampus image_id
  162. AiCenter string //grampus ai center: center_id+center_name
  163. TrainUrl string //输出模型的obs路径
  164. BranchName string `xorm:"varchar(2550)"` //分支名称
  165. Parameters string //传给modelarts的param参数
  166. BootFile string `xorm:"varchar(2550)"` //启动文件
  167. DataUrl string `xorm:"varchar(3500)"` //数据集的obs路径
  168. LogUrl string //日志输出的obs路径
  169. PreVersionId int64 //父版本的版本id
  170. FlavorCode string //modelarts上的规格id
  171. Description string `xorm:"varchar(2550)"` //描述
  172. WorkServerNumber int //节点数
  173. FlavorName string //规格名称
  174. EngineName string //引擎名称
  175. TotalVersionCount int //任务的所有版本数量,包括删除的
  176. LabelName string //标签名称
  177. ModelName string //模型名称
  178. ModelVersion string //模型版本
  179. CkptName string //权重文件名称
  180. PreTrainModelUrl string //预训练模型地址
  181. ResultUrl string //推理结果的obs路径
  182. ResultJson string `xorm:"varchar(4000)"`
  183. User *User `xorm:"-"`
  184. Repo *Repository `xorm:"-"`
  185. BenchmarkType string `xorm:"-"` //算法评测,模型评测
  186. BenchmarkTypeName string `xorm:"-"`
  187. BenchmarkTypeRankLink string `xorm:"-"`
  188. StartTime timeutil.TimeStamp
  189. EndTime timeutil.TimeStamp
  190. Cleared bool `xorm:"DEFAULT false"`
  191. Spec *Specification `xorm:"-"`
  192. }
  193. type CloudbrainShow struct {
  194. ID int64
  195. JobID string
  196. RepoFullName string
  197. Type int
  198. JobType string
  199. DisplayJobName string
  200. Duration string
  201. ResourceSpec *Specification
  202. ComputeResource string
  203. AiCenter string
  204. WorkServerNumber int
  205. }
  206. type CloudbrainShow4Action struct {
  207. ID int64
  208. JobID string
  209. Type int
  210. JobType string
  211. DisplayJobName string
  212. ComputeResource string
  213. }
  214. func (task *Cloudbrain) ToShow() *CloudbrainShow {
  215. n := 1
  216. if task.WorkServerNumber > 1 {
  217. n = task.WorkServerNumber
  218. }
  219. c := &CloudbrainShow{
  220. ID: task.ID,
  221. JobID: task.JobID,
  222. JobType: task.JobType,
  223. Type: task.Type,
  224. DisplayJobName: task.DisplayJobName,
  225. Duration: task.TrainJobDuration,
  226. ResourceSpec: task.Spec,
  227. ComputeResource: task.ComputeResource,
  228. WorkServerNumber: n,
  229. }
  230. if task.Repo != nil {
  231. c.RepoFullName = task.Repo.FullName()
  232. }
  233. return c
  234. }
  235. func (task *Cloudbrain) ComputeAndSetDuration() {
  236. var d int64
  237. if task.StartTime == 0 {
  238. d = 0
  239. } else if task.EndTime == 0 {
  240. if !task.IsTerminal() {
  241. d = time.Now().Unix() - task.StartTime.AsTime().Unix()
  242. }
  243. } else {
  244. d = task.EndTime.AsTime().Unix() - task.StartTime.AsTime().Unix()
  245. }
  246. if d < 0 {
  247. d = 0
  248. }
  249. task.Duration = d
  250. task.TrainJobDuration = ConvertDurationToStr(d)
  251. }
  252. func (task *Cloudbrain) CorrectCreateUnix() {
  253. if task.StartTime > 0 && task.CreatedUnix > task.StartTime {
  254. task.CreatedUnix = task.StartTime
  255. }
  256. }
  257. func (task *Cloudbrain) IsTerminal() bool {
  258. status := task.Status
  259. return status == string(ModelArtsTrainJobCompleted) || status == string(ModelArtsTrainJobFailed) ||
  260. status == string(ModelArtsTrainJobKilled) || status == string(ModelArtsStopped) ||
  261. status == string(JobStopped) || status == string(JobFailed) ||
  262. status == string(JobSucceeded) || status == GrampusStatusFailed ||
  263. status == GrampusStatusSucceeded || status == GrampusStatusStopped
  264. }
  265. func (task *Cloudbrain) IsRunning() bool {
  266. status := task.Status
  267. return status == string(ModelArtsTrainJobRunning) || status == string(ModelArtsRunning) ||
  268. status == string(JobRunning) || status == GrampusStatusRunning
  269. }
  270. func (task *Cloudbrain) IsUserHasRight(user *User) bool {
  271. if user == nil {
  272. return false
  273. }
  274. return user.IsAdmin || user.ID == task.UserID
  275. }
  276. func (task *Cloudbrain) IsGPUTask() bool {
  277. return task.ComputeResource == GPUResource
  278. }
  279. func (task *Cloudbrain) IsGCUTask() bool {
  280. return task.ComputeResource == GCUResource
  281. }
  282. func (task *Cloudbrain) IsNPUTask() bool {
  283. return task.ComputeResource == NPUResource
  284. }
  285. func ConvertDurationToStr(duration int64) string {
  286. if duration <= 0 {
  287. return DURATION_STR_ZERO
  288. }
  289. return util.AddZero(duration/3600) + ":" + util.AddZero(duration%3600/60) + ":" + util.AddZero(duration%60)
  290. }
  291. func ConvertStrToDuration(trainJobDuration string) int64 {
  292. trainJobDurationList := strings.Split(trainJobDuration, ":")
  293. if len(trainJobDurationList) == 3 {
  294. i, _ := strconv.ParseInt(trainJobDurationList[0], 10, 64)
  295. j, _ := strconv.ParseInt(trainJobDurationList[1], 10, 64)
  296. k, _ := strconv.ParseInt(trainJobDurationList[2], 10, 64)
  297. return i*3600 + j*60 + k
  298. } else {
  299. return 0
  300. }
  301. }
  302. func IsTrainJobTerminal(status string) bool {
  303. return status == string(ModelArtsTrainJobCompleted) || status == string(ModelArtsTrainJobFailed) || status == string(ModelArtsTrainJobKilled) || status == GrampusStatusFailed || status == GrampusStatusStopped || status == GrampusStatusSucceeded
  304. }
  305. func IsModelArtsDebugJobTerminal(status string) bool {
  306. return status == string(ModelArtsStopped)
  307. }
  308. func IsCloudBrainOneDebugJobTerminal(status string) bool {
  309. return status == string(JobStopped) || status == string(JobFailed) || status == string(JobSucceeded)
  310. }
  311. func IsModelBenchMarkJobType(jobType string) bool {
  312. return jobType == string(JobTypeSnn4imagenet) || jobType == string(JobTypeBrainScore) || jobType == string(JobTypeSnn4Ecoset)
  313. }
  314. func ParseAndSetDurationFromCloudBrainOne(result JobResultPayload, task *Cloudbrain) {
  315. isActivated := result.JobStatus.CreatedTime > 0
  316. if task.StartTime == 0 && isActivated {
  317. task.StartTime = timeutil.TimeStamp(result.JobStatus.CreatedTime / 1000)
  318. }
  319. if task.EndTime == 0 && IsCloudBrainOneDebugJobTerminal(task.Status) && isActivated {
  320. if result.JobStatus.CompletedTime > 0 {
  321. task.EndTime = timeutil.TimeStamp(result.JobStatus.CompletedTime / 1000)
  322. }
  323. }
  324. task.CorrectCreateUnix()
  325. task.ComputeAndSetDuration()
  326. }
  327. func ParseAndSetDurationFromModelArtsNotebook(result *GetNotebook2Result, job *Cloudbrain) {
  328. if job.StartTime == 0 && result.Lease.UpdateTime > 0 {
  329. job.StartTime = timeutil.TimeStamp(result.Lease.UpdateTime / 1000)
  330. }
  331. job.Status = result.Status
  332. if job.EndTime == 0 && IsModelArtsDebugJobTerminal(job.Status) {
  333. job.EndTime = timeutil.TimeStampNow()
  334. }
  335. job.CorrectCreateUnix()
  336. job.ComputeAndSetDuration()
  337. }
  338. type CloudbrainInfo struct {
  339. Cloudbrain `xorm:"extends"`
  340. User `xorm:"extends"`
  341. }
  342. type CloudBrainLoginResult struct {
  343. Code string
  344. Msg string
  345. Payload map[string]interface{}
  346. }
  347. type TaskRole struct {
  348. Name string `json:"name"`
  349. TaskNumber int `json:"taskNumber"`
  350. MinSucceededTaskCount int `json:"minSucceededTaskCount"`
  351. MinFailedTaskCount int `json:"minFailedTaskCount"`
  352. CPUNumber int `json:"cpuNumber"`
  353. GPUNumber int `json:"gpuNumber"`
  354. MemoryMB int `json:"memoryMB"`
  355. ShmMB int `json:"shmMB"`
  356. Command string `json:"command"`
  357. NeedIBDevice bool `json:"needIBDevice"`
  358. IsMainRole bool `json:"isMainRole"`
  359. UseNNI bool `json:"useNNI"`
  360. }
  361. type StHostPath struct {
  362. Path string `json:"path"`
  363. MountPath string `json:"mountPath"`
  364. ReadOnly bool `json:"readOnly"`
  365. }
  366. type Volume struct {
  367. HostPath StHostPath `json:"hostPath"`
  368. }
  369. type CreateJobParams struct {
  370. JobName string `json:"jobName"`
  371. RetryCount int8 `json:"retryCount"`
  372. GpuType string `json:"gpuType"`
  373. Image string `json:"image"`
  374. TaskRoles []TaskRole `json:"taskRoles"`
  375. Volumes []Volume `json:"volumes"`
  376. }
  377. type CreateJobResult struct {
  378. Code string `json:"code"`
  379. Msg string `json:"msg"`
  380. Payload map[string]interface{} `json:"payload"`
  381. }
  382. type QueueDetailResult struct {
  383. Code string `json:"code"`
  384. Msg string `json:"msg"`
  385. Payload map[string]QueueDetail `json:"payload"`
  386. }
  387. type QueueDetail struct {
  388. JobScheduleInfo JobScheduleInfo `json:"JobScheduleInfo"`
  389. }
  390. type JobScheduleInfo struct {
  391. Pending int `json:"Pending"`
  392. Running int `json:"Running"`
  393. MedianPendingJobDurationSec int `json:"MedianPendingJobDurationSec"`
  394. }
  395. type GetJobResult struct {
  396. Code string `json:"code"`
  397. Msg string `json:"msg"`
  398. Payload map[string]interface{} `json:"payload"`
  399. }
  400. type GetImagesResult struct {
  401. Code string `json:"code"`
  402. Msg string `json:"msg"`
  403. Payload GetImagesPayload `json:"payload"`
  404. }
  405. type GetImagesPayload struct {
  406. Count int `json:"count"`
  407. TotalPages int `json:"totalPages,omitempty"`
  408. ImageInfo []*ImageInfo `json:"rows"`
  409. }
  410. type CloudbrainsOptions struct {
  411. ListOptions
  412. RepoID int64 // include all repos if empty
  413. UserID int64
  414. JobID string
  415. SortType string
  416. CloudbrainIDs []int64
  417. JobStatus []string
  418. JobStatusNot bool
  419. Keyword string
  420. Type int
  421. JobTypes []string
  422. VersionName string
  423. IsLatestVersion string
  424. JobTypeNot bool
  425. NeedRepoInfo bool
  426. RepoIDList []int64
  427. BeginTime time.Time
  428. EndTime time.Time
  429. ComputeResource string
  430. BeginTimeUnix int64
  431. EndTimeUnix int64
  432. DateBeginTimeUnix int64
  433. AiCenter string
  434. NeedDeleteInfo string
  435. Cluster string
  436. AccCardType string
  437. AccCardsNum int
  438. WorkServerNumber int
  439. }
  440. type TaskPod struct {
  441. TaskRoleStatus struct {
  442. Name string `json:"name"`
  443. } `json:"taskRoleStatus"`
  444. //TaskStatuses []struct {
  445. // TaskIndex int `json:"taskIndex"`
  446. // PodUID string `json:"podUid"`
  447. // PodIP string `json:"podIp"`
  448. // PodName string `json:"podName"`
  449. // ContainerID string `json:"containerId"`
  450. // ContainerIP string `json:"containerIp"`
  451. // ContainerGpus string `json:"containerGpus"`
  452. // State string `json:"state"`
  453. // StartAt time.Time `json:"startAt"`
  454. // FinishedAt time.Time `json:"finishedAt"`
  455. // ExitCode int `json:"exitCode"`
  456. // ExitDiagnostics string `json:"exitDiagnostics"`
  457. // RetriedCount int `json:"retriedCount"`
  458. // StartTime string
  459. // FinishedTime string
  460. //} `json:"taskStatuses"`
  461. TaskStatuses []TaskStatuses `json:"taskStatuses"`
  462. }
  463. type TaskStatuses struct {
  464. TaskIndex int `json:"taskIndex"`
  465. PodUID string `json:"podUid"`
  466. PodIP string `json:"podIp"`
  467. PodName string `json:"podName"`
  468. ContainerID string `json:"containerId"`
  469. ContainerIP string `json:"containerIp"`
  470. ContainerGpus string `json:"containerGpus"`
  471. State string `json:"state"`
  472. StartAt time.Time `json:"startAt"`
  473. FinishedAt time.Time `json:"finishedAt"`
  474. ExitCode int `json:"exitCode"`
  475. ExitDiagnostics string `json:"exitDiagnostics"`
  476. RetriedCount int `json:"retriedCount"`
  477. StartTime string
  478. FinishedTime string
  479. }
  480. type TaskInfo struct {
  481. Username string `json:"username"`
  482. TaskName string `json:"task_name"`
  483. CodeName string `json:"code_name"`
  484. BenchmarkCategory []string `json:"selected_category"`
  485. CodeLink string `json:"code_link"`
  486. GpuType string `json:"gpu_type"`
  487. }
  488. func ConvertToTaskPod(input map[string]interface{}) (TaskPod, error) {
  489. data, _ := json.Marshal(input)
  490. var taskPod TaskPod
  491. err := json.Unmarshal(data, &taskPod)
  492. taskPod.TaskStatuses[0].StartTime = time.Unix(taskPod.TaskStatuses[0].StartAt.Unix()+8*3600, 0).UTC().Format("2006-01-02 15:04:05")
  493. taskPod.TaskStatuses[0].FinishedTime = time.Unix(taskPod.TaskStatuses[0].FinishedAt.Unix()+8*3600, 0).UTC().Format("2006-01-02 15:04:05")
  494. //if the task is not finished or stopped,the cloudbrain renturns 0001-01-01 08:00:00, the finishedTime shows with -
  495. if strings.HasPrefix(taskPod.TaskStatuses[0].FinishedTime, "0001") {
  496. taskPod.TaskStatuses[0].FinishedTime = "-"
  497. }
  498. return taskPod, err
  499. }
  500. type JobResultPayload struct {
  501. ID string `json:"id"`
  502. Name string `json:"name"`
  503. Platform string `json:"platform"`
  504. JobStatus struct {
  505. Username string `json:"username"`
  506. State string `json:"state"`
  507. SubState string `json:"subState"`
  508. ExecutionType string `json:"executionType"`
  509. Retries int `json:"retries"`
  510. CreatedTime int64 `json:"createdTime"`
  511. CompletedTime int64 `json:"completedTime"`
  512. AppID string `json:"appId"`
  513. AppProgress string `json:"appProgress"`
  514. AppTrackingURL string `json:"appTrackingUrl"`
  515. AppLaunchedTime int64 `json:"appLaunchedTime"`
  516. AppCompletedTime interface{} `json:"appCompletedTime"`
  517. AppExitCode int `json:"appExitCode"`
  518. AppExitDiagnostics string `json:"appExitDiagnostics"`
  519. AppExitType interface{} `json:"appExitType"`
  520. VirtualCluster string `json:"virtualCluster"`
  521. StartTime string
  522. EndTime string
  523. } `json:"jobStatus"`
  524. TaskRoles map[string]interface{} `json:"taskRoles"`
  525. Resource struct {
  526. CPU int `json:"cpu"`
  527. Memory string `json:"memory"`
  528. NvidiaComGpu int `json:"nvidia.com/gpu"`
  529. } `json:"resource"`
  530. Config struct {
  531. Image string `json:"image"`
  532. JobID string `json:"jobId"`
  533. GpuType string `json:"gpuType"`
  534. JobName string `json:"jobName"`
  535. JobType string `json:"jobType"`
  536. TaskRoles []struct {
  537. Name string `json:"name"`
  538. ShmMB int `json:"shmMB"`
  539. Command string `json:"command"`
  540. MemoryMB int `json:"memoryMB"`
  541. CPUNumber int `json:"cpuNumber"`
  542. GpuNumber int `json:"gpuNumber"`
  543. IsMainRole bool `json:"isMainRole"`
  544. TaskNumber int `json:"taskNumber"`
  545. NeedIBDevice bool `json:"needIBDevice"`
  546. MinFailedTaskCount int `json:"minFailedTaskCount"`
  547. MinSucceededTaskCount int `json:"minSucceededTaskCount"`
  548. } `json:"taskRoles"`
  549. RetryCount int `json:"retryCount"`
  550. } `json:"config"`
  551. Userinfo struct {
  552. User string `json:"user"`
  553. OrgID string `json:"org_id"`
  554. } `json:"userinfo"`
  555. }
  556. func ConvertToJobResultPayload(input map[string]interface{}) (JobResultPayload, error) {
  557. data, _ := json.Marshal(input)
  558. var jobResultPayload JobResultPayload
  559. err := json.Unmarshal(data, &jobResultPayload)
  560. jobResultPayload.JobStatus.StartTime = time.Unix(jobResultPayload.JobStatus.CreatedTime/1000, 0).Format("2006-01-02 15:04:05")
  561. jobResultPayload.JobStatus.EndTime = time.Unix(jobResultPayload.JobStatus.CompletedTime/1000, 0).Format("2006-01-02 15:04:05")
  562. if jobResultPayload.JobStatus.State == string(JobWaiting) {
  563. jobResultPayload.JobStatus.StartTime = "-"
  564. jobResultPayload.JobStatus.EndTime = "-"
  565. }
  566. return jobResultPayload, err
  567. }
  568. type ImagesResultPayload struct {
  569. Images []struct {
  570. ID int `json:"id"`
  571. Name string `json:"name"`
  572. Place string `json:"place"`
  573. Description string `json:"description"`
  574. Provider string `json:"provider"`
  575. Createtime string `json:"createtime"`
  576. Remark string `json:"remark"`
  577. } `json:"taskStatuses"`
  578. }
  579. type ImageInfo struct {
  580. ID int `json:"id"`
  581. Name string `json:"name"`
  582. Place string `json:"place"`
  583. Description string `json:"description"`
  584. Provider string `json:"provider"`
  585. Createtime string `json:"createtime"`
  586. Remark string `json:"remark"`
  587. IsPublic int `json:"isPublic"`
  588. PlaceView string
  589. }
  590. type Categories struct {
  591. Category []*Category `json:"category"`
  592. }
  593. type Category struct {
  594. Id int `json:"id"`
  595. Value string `json:"value"`
  596. }
  597. type BenchmarkTypes struct {
  598. BenchmarkType []*BenchmarkType `json:"type"`
  599. }
  600. type BenchmarkType struct {
  601. Id int `json:"id"`
  602. RankLink string `json:"rank_link"`
  603. First string `json:"first"` //一级算法类型名称
  604. Second []*BenchmarkDataset `json:"second"`
  605. }
  606. type BenchmarkDataset struct {
  607. Id int `json:"id"`
  608. Value string `json:"value"` //二级算法类型名称
  609. Attachment string `json:"attachment"` //数据集的uuid
  610. Owner string `json:"owner"` //评估脚本所在仓库的拥有者
  611. RepoName string `json:"repo_name"` //评估脚本所在仓库的名称
  612. }
  613. type GpuInfos struct {
  614. GpuInfo []*GpuInfo `json:"gpu_type"`
  615. }
  616. type GpuInfo struct {
  617. Id int `json:"id"`
  618. Value string `json:"value"`
  619. Queue string `json:"queue"`
  620. }
  621. type ResourceSpecs struct {
  622. ResourceSpec []*ResourceSpec `json:"resorce_specs"`
  623. }
  624. type ResourceSpec struct {
  625. Id int `json:"id"`
  626. CpuNum int `json:"cpu"`
  627. GpuNum int `json:"gpu"`
  628. MemMiB int `json:"memMiB"`
  629. ShareMemMiB int `json:"shareMemMiB"`
  630. UnitPrice int64 `json:"unitPrice"`
  631. }
  632. type FlavorInfos struct {
  633. FlavorInfo []*FlavorInfo `json:"flavor_info"`
  634. }
  635. type FlavorInfo struct {
  636. Id int `json:"id"`
  637. Value string `json:"value"`
  638. Desc string `json:"desc"`
  639. UnitPrice int64 `json:"unitPrice"`
  640. }
  641. type SpecialPools struct {
  642. Pools []*SpecialPool `json:"pools"`
  643. }
  644. type SpecialPool struct {
  645. Org string `json:"org"`
  646. Type string `json:"type"`
  647. IsExclusive bool `json:"isExclusive"`
  648. Pool []*GpuInfo `json:"pool"`
  649. JobType []string `json:"jobType"`
  650. ResourceSpec []*ResourceSpec `json:"resourceSpecs"`
  651. Flavor []*setting.FlavorInfo `json:"flavor"`
  652. }
  653. type PoolInfos struct {
  654. PoolInfo []*PoolInfo `json:"pool_info"`
  655. }
  656. type PoolInfo struct {
  657. PoolId string `json:"pool_id"`
  658. PoolName string `json:"pool_name"`
  659. PoolType string `json:"pool_type"`
  660. }
  661. type CommitImageCloudBrainParams struct {
  662. Ip string `json:"ip"`
  663. TaskContainerId string `json:"taskContainerId"`
  664. ImageTag string `json:"imageTag"`
  665. ImageDescription string `json:"imageDescription"`
  666. }
  667. type CommitImageParams struct {
  668. CommitImageCloudBrainParams
  669. IsPrivate bool
  670. Topics []string
  671. CloudBrainType int
  672. UID int64
  673. Place string
  674. Type int
  675. }
  676. type CommitImageResult struct {
  677. Code string `json:"code"`
  678. Msg string `json:"msg"`
  679. Payload map[string]interface{} `json:"payload"`
  680. }
  681. type GetJobLogParams struct {
  682. Size string `json:"size"`
  683. Sort string `json:"sort"`
  684. QueryInfo QueryInfo `json:"query"`
  685. }
  686. type QueryInfo struct {
  687. MatchInfo MatchInfo `json:"match"`
  688. }
  689. type MatchInfo struct {
  690. PodName string `json:"kubernetes.pod.name"`
  691. }
  692. type GetJobLogResult struct {
  693. ScrollID string `json:"_scroll_id"`
  694. Took int `json:"took"`
  695. TimedOut bool `json:"timed_out"`
  696. Shards struct {
  697. Total int `json:"total"`
  698. Successful int `json:"successful"`
  699. Skipped int `json:"skipped"`
  700. Failed int `json:"failed"`
  701. } `json:"_shards"`
  702. Hits struct {
  703. Hits []Hits `json:"hits"`
  704. } `json:"hits"`
  705. }
  706. type Hits struct {
  707. Index string `json:"_index"`
  708. Type string `json:"_type"`
  709. ID string `json:"_id"`
  710. Source struct {
  711. Message string `json:"message"`
  712. } `json:"_source"`
  713. Sort []int `json:"sort"`
  714. }
  715. type GetAllJobLogParams struct {
  716. Scroll string `json:"scroll"`
  717. ScrollID string `json:"scroll_id"`
  718. }
  719. type DeleteJobLogTokenParams struct {
  720. ScrollID string `json:"scroll_id"`
  721. }
  722. type DeleteJobLogTokenResult struct {
  723. Succeeded bool `json:"succeeded"`
  724. NumFreed int `json:"num_freed"`
  725. }
  726. type CloudBrainResult struct {
  727. Code string `json:"code"`
  728. Msg string `json:"msg"`
  729. }
  730. type CreateNotebook2Params struct {
  731. JobName string `json:"name"`
  732. Description string `json:"description"`
  733. Duration int64 `json:"duration"` //ms
  734. Feature string `json:"feature"`
  735. PoolID string `json:"pool_id"`
  736. Flavor string `json:"flavor"`
  737. ImageID string `json:"image_id"`
  738. WorkspaceID string `json:"workspace_id"`
  739. Volume VolumeReq `json:"volume"`
  740. }
  741. type CreateNotebookWithoutPoolParams struct {
  742. JobName string `json:"name"`
  743. Description string `json:"description"`
  744. Duration int64 `json:"duration"` //ms
  745. Feature string `json:"feature"`
  746. Flavor string `json:"flavor"`
  747. ImageID string `json:"image_id"`
  748. WorkspaceID string `json:"workspace_id"`
  749. Volume VolumeReq `json:"volume"`
  750. }
  751. type VolumeReq struct {
  752. Capacity int `json:"capacity"`
  753. Category string `json:"category"`
  754. Ownership string `json:"ownership"`
  755. Uri string `json:"uri"`
  756. }
  757. type CreateNotebookParams struct {
  758. JobName string `json:"name"`
  759. Description string `json:"description"`
  760. ProfileID string `json:"profile_id"`
  761. Flavor string `json:"flavor"`
  762. Spec Spec `json:"spec"`
  763. Workspace Workspace `json:"workspace"`
  764. Pool Pool `json:"pool"`
  765. }
  766. type Pool struct {
  767. ID string `json:"id"`
  768. Name string `json:"name"`
  769. Type string `json:"type"`
  770. }
  771. type Workspace struct {
  772. ID string `json:"id"`
  773. }
  774. type Spec struct {
  775. Storage Storage `json:"storage"`
  776. AutoStop AutoStop `json:"auto_stop"`
  777. }
  778. type AutoStop struct {
  779. Enable bool `json:"enable"`
  780. Duration int `json:"duration"`
  781. }
  782. type Storage struct {
  783. Type string `json:"type"`
  784. Location Location `json:"location"`
  785. }
  786. type Location struct {
  787. Path string `json:"path"`
  788. }
  789. type NotebookResult struct {
  790. ErrorCode string `json:"error_code"`
  791. ErrorMsg string `json:"error_msg"`
  792. }
  793. type CreateNotebookResult struct {
  794. ErrorCode string `json:"error_code"`
  795. ErrorMsg string `json:"error_msg"`
  796. ID string `json:"id"`
  797. Name string `json:"name"`
  798. Description string `json:"description"`
  799. Status string `json:"status"`
  800. CreationTimestamp string `json:"creation_timestamp"`
  801. LatestUpdateTimestamp string `json:"latest_update_timestamp"`
  802. Profile struct {
  803. ID string `json:"id"`
  804. Name string `json:"name"`
  805. Description string `json:"description"`
  806. DeType string `json:"de_type"`
  807. FlavorType string `json:"flavor_type"`
  808. } `json:"profile"`
  809. Flavor string `json:"flavor"`
  810. FlavorDetails struct {
  811. Name string `json:"name"`
  812. Status string `json:"status"`
  813. QueuingNum int `json:"queuing_num"`
  814. QueueLeftTime int `json:"queue_left_time"` //s
  815. Duration int `json:"duration"` //auto_stop_time s
  816. } `json:"flavor_details"`
  817. }
  818. type GetNotebookResult struct {
  819. ErrorCode string `json:"error_code"`
  820. ErrorMsg string `json:"error_msg"`
  821. ID string `json:"id"`
  822. Name string `json:"name"`
  823. Description string `json:"description"`
  824. Status string `json:"status"`
  825. CreationTimestamp string `json:"creation_timestamp"`
  826. CreateTime string
  827. LatestUpdateTimestamp string `json:"latest_update_timestamp"`
  828. LatestUpdateTime string
  829. Profile struct {
  830. ID string `json:"id"`
  831. Name string `json:"name"`
  832. Description string `json:"description"`
  833. DeType string `json:"de_type"`
  834. FlavorType string `json:"flavor_type"`
  835. } `json:"profile"`
  836. Flavor string `json:"flavor"`
  837. FlavorDetails struct {
  838. Name string `json:"name"`
  839. Status string `json:"status"`
  840. QueuingNum int `json:"queuing_num"`
  841. QueueLeftTime int `json:"queue_left_time"` //s
  842. Duration int `json:"duration"` //auto_stop_time s
  843. } `json:"flavor_details"`
  844. QueuingInfo struct {
  845. ID string `json:"id"`
  846. Name string `json:"name"`
  847. Flavor string `json:"flavor"`
  848. DeType string `json:"de_type"`
  849. Status string `json:"status"`
  850. BeginTimestamp int `json:"begin_timestamp"` //time of instance begin in queue
  851. BeginTime string
  852. RemainTime int `json:"remain_time"` //remain time of instance
  853. EndTimestamp int `json:"end_timestamp"` //
  854. EndTime string
  855. Rank int `json:"rank"` //rank of instance in queue
  856. } `json:"queuing_info"`
  857. Spec struct {
  858. Annotations struct {
  859. TargetDomain string `json:"target_domain"`
  860. Url string `json:"url"`
  861. } `json:"annotations"`
  862. } `json:"spec"`
  863. }
  864. type GetNotebook2Result struct {
  865. ErrorCode string `json:"error_code"`
  866. ErrorMsg string `json:"error_msg"`
  867. FailReason string `json:"fail_reason"`
  868. ID string `json:"id"`
  869. Name string `json:"name"`
  870. Description string `json:"description"`
  871. Status string `json:"status"`
  872. Url string `json:"url"` //实例访问的URL
  873. Token string `json:"token"` //notebook鉴权使用的token信息
  874. Flavor string `json:"flavor"`
  875. CreateTime string
  876. LatestUpdateTime string
  877. CreateAt int64 `json:"create_at"` //实例创建的时间,UTC毫秒
  878. UpdateAt int64 `json:"update_at"` //实例最后更新(不包括保活心跳)的时间,UTC毫秒
  879. Image struct {
  880. Name string `json:"name"`
  881. Status string `json:"status"`
  882. QueuingNum int `json:"queuing_num"`
  883. QueueLeftTime int `json:"queue_left_time"` //s
  884. Duration int `json:"duration"` //auto_stop_time s
  885. } `json:"image"`
  886. Lease struct {
  887. CreateTime int64 `json:"create_at"` //实例创建的时间,UTC毫秒
  888. Duration int64 `json:"duration"` //实例运行时长,以创建时间为起点计算,即“创建时间+duration > 当前时刻”时,系统会自动停止实例
  889. UpdateTime int64 `json:"update_at"` //实例最后更新(不包括保活心跳)的时间,UTC毫秒
  890. } `json:"lease"` //实例自动停止的倒计时信息
  891. VolumeRes struct {
  892. Capacity int `json:"capacity"`
  893. Category string `json:"category"`
  894. MountPath string `json:"mount_path"`
  895. Ownership string `json:"ownership"`
  896. Status string `json:"status"`
  897. } `json:"volume"`
  898. }
  899. type GetTokenParams struct {
  900. Auth Auth `json:"auth"`
  901. }
  902. type Auth struct {
  903. Identity Identity `json:"identity"`
  904. Scope Scope `json:"scope"`
  905. }
  906. type Scope struct {
  907. Project Project `json:"project"`
  908. }
  909. type Project struct {
  910. Name string `json:"name"`
  911. }
  912. type Identity struct {
  913. Methods []string `json:"methods"`
  914. Password Password `json:"password"`
  915. }
  916. type Password struct {
  917. User NotebookUser `json:"user"`
  918. }
  919. type NotebookUser struct {
  920. Name string `json:"name"`
  921. Password string `json:"password"`
  922. Domain Domain `json:"domain"`
  923. }
  924. type Domain struct {
  925. Name string `json:"name"`
  926. }
  927. const (
  928. ActionStart = "start"
  929. ActionStop = "stop"
  930. ActionRestart = "restart"
  931. ActionQueue = "queue"
  932. ActionDequeue = "dequeue"
  933. )
  934. type NotebookAction struct {
  935. Action string `json:"action"`
  936. }
  937. type NotebookActionResult struct {
  938. ErrorCode string `json:"error_code"`
  939. ErrorMsg string `json:"error_msg"`
  940. CurrentStatus string `json:"current_status"`
  941. PreviousState string `json:"previous_state"`
  942. Status string `json:"status"`
  943. }
  944. type NotebookGetJobTokenResult struct {
  945. ErrorCode string `json:"error_code"`
  946. ErrorMsg string `json:"error_msg"`
  947. Token string `json:"token"`
  948. }
  949. type NotebookDelResult struct {
  950. NotebookResult
  951. InstanceID string `json:"instance_id"`
  952. }
  953. type CreateUserImageTrainJobParams struct {
  954. JobName string `json:"job_name"`
  955. Description string `json:"job_desc"`
  956. Config UserImageConfig `json:"config"`
  957. WorkspaceID string `json:"workspace_id"`
  958. }
  959. type UserImageConfig struct {
  960. WorkServerNum int `json:"worker_server_num"`
  961. AppUrl string `json:"app_url"` //训练作业的代码目录
  962. BootFileUrl string `json:"boot_file_url"` //训练作业的代码启动文件,需要在代码目录下
  963. Parameter []Parameter `json:"parameter"`
  964. DataUrl string `json:"data_url"` //训练作业需要的数据集OBS路径URL
  965. TrainUrl string `json:"train_url"` //训练作业的输出文件OBS路径URL
  966. LogUrl string `json:"log_url"`
  967. UserImageUrl string `json:"user_image_url"`
  968. UserCommand string `json:"user_command"`
  969. CreateVersion bool `json:"create_version"`
  970. Flavor Flavor `json:"flavor"`
  971. PoolID string `json:"pool_id"`
  972. ShareAddr string `json:"nas_share_addr"`
  973. MountPath string `json:"nas_mount_path"`
  974. NasType string `json:"nas_type"`
  975. }
  976. type CreateTrainJobParams struct {
  977. JobName string `json:"job_name"`
  978. Description string `json:"job_desc"`
  979. Config Config `json:"config"`
  980. WorkspaceID string `json:"workspace_id"`
  981. }
  982. type Config struct {
  983. WorkServerNum int `json:"worker_server_num"`
  984. AppUrl string `json:"app_url"` //训练作业的代码目录
  985. BootFileUrl string `json:"boot_file_url"` //训练作业的代码启动文件,需要在代码目录下
  986. Parameter []Parameter `json:"parameter"`
  987. DataUrl string `json:"data_url"` //训练作业需要的数据集OBS路径URL
  988. EngineID int64 `json:"engine_id"`
  989. TrainUrl string `json:"train_url"` //训练作业的输出文件OBS路径URL
  990. LogUrl string `json:"log_url"`
  991. //UserImageUrl string `json:"user_image_url"`
  992. //UserCommand string `json:"user_command"`
  993. CreateVersion bool `json:"create_version"`
  994. Flavor Flavor `json:"flavor"`
  995. PoolID string `json:"pool_id"`
  996. ShareAddr string `json:"nas_share_addr"`
  997. MountPath string `json:"nas_mount_path"`
  998. NasType string `json:"nas_type"`
  999. }
  1000. type CreateInferenceJobParams struct {
  1001. JobName string `json:"job_name"`
  1002. Description string `json:"job_desc"`
  1003. InfConfig InfConfig `json:"config"`
  1004. WorkspaceID string `json:"workspace_id"`
  1005. }
  1006. type CreateInfUserImageParams struct {
  1007. JobName string `json:"job_name"`
  1008. Description string `json:"job_desc"`
  1009. Config InfUserImageConfig `json:"config"`
  1010. WorkspaceID string `json:"workspace_id"`
  1011. }
  1012. type InfConfig struct {
  1013. WorkServerNum int `json:"worker_server_num"`
  1014. AppUrl string `json:"app_url"` //训练作业的代码目录
  1015. BootFileUrl string `json:"boot_file_url"` //训练作业的代码启动文件,需要在代码目录下
  1016. Parameter []Parameter `json:"parameter"`
  1017. DataUrl string `json:"data_url"` //训练作业需要的数据集OBS路径URL
  1018. EngineID int64 `json:"engine_id"`
  1019. LogUrl string `json:"log_url"`
  1020. CreateVersion bool `json:"create_version"`
  1021. Flavor Flavor `json:"flavor"`
  1022. PoolID string `json:"pool_id"`
  1023. }
  1024. type InfUserImageConfig struct {
  1025. WorkServerNum int `json:"worker_server_num"`
  1026. AppUrl string `json:"app_url"` //训练作业的代码目录
  1027. BootFileUrl string `json:"boot_file_url"` //训练作业的代码启动文件,需要在代码目录下
  1028. Parameter []Parameter `json:"parameter"`
  1029. DataUrl string `json:"data_url"` //训练作业需要的数据集OBS路径URL
  1030. EngineID int64 `json:"engine_id"`
  1031. LogUrl string `json:"log_url"`
  1032. CreateVersion bool `json:"create_version"`
  1033. Flavor Flavor `json:"flavor"`
  1034. PoolID string `json:"pool_id"`
  1035. UserImageUrl string `json:"user_image_url"`
  1036. UserCommand string `json:"user_command"`
  1037. }
  1038. type CreateTrainJobVersionParams struct {
  1039. Description string `json:"job_desc"`
  1040. Config TrainJobVersionConfig `json:"config"`
  1041. }
  1042. type CreateTrainJobVersionUserImageParams struct {
  1043. Description string `json:"job_desc"`
  1044. Config TrainJobVersionUserImageConfig `json:"config"`
  1045. }
  1046. type TrainJobVersionConfig struct {
  1047. WorkServerNum int `json:"worker_server_num"`
  1048. AppUrl string `json:"app_url"` //训练作业的代码目录
  1049. BootFileUrl string `json:"boot_file_url"` //训练作业的代码启动文件,需要在代码目录下
  1050. Parameter []Parameter `json:"parameter"`
  1051. DataUrl string `json:"data_url"` //训练作业需要的数据集OBS路径URL
  1052. EngineID int64 `json:"engine_id"`
  1053. TrainUrl string `json:"train_url"` //训练作业的输出文件OBS路径URL
  1054. LogUrl string `json:"log_url"`
  1055. Flavor Flavor `json:"flavor"`
  1056. PoolID string `json:"pool_id"`
  1057. PreVersionId int64 `json:"pre_version_id"`
  1058. ShareAddr string `json:"nas_share_addr"`
  1059. MountPath string `json:"nas_mount_path"`
  1060. NasType string `json:"nas_type"`
  1061. }
  1062. type TrainJobVersionUserImageConfig struct {
  1063. WorkServerNum int `json:"worker_server_num"`
  1064. AppUrl string `json:"app_url"` //训练作业的代码目录
  1065. BootFileUrl string `json:"boot_file_url"` //训练作业的代码启动文件,需要在代码目录下
  1066. Parameter []Parameter `json:"parameter"`
  1067. DataUrl string `json:"data_url"` //训练作业需要的数据集OBS路径URL
  1068. TrainUrl string `json:"train_url"` //训练作业的输出文件OBS路径URL
  1069. LogUrl string `json:"log_url"`
  1070. Flavor Flavor `json:"flavor"`
  1071. PoolID string `json:"pool_id"`
  1072. PreVersionId int64 `json:"pre_version_id"`
  1073. UserImageUrl string `json:"user_image_url"`
  1074. UserCommand string `json:"user_command"`
  1075. ShareAddr string `json:"nas_share_addr"`
  1076. MountPath string `json:"nas_mount_path"`
  1077. NasType string `json:"nas_type"`
  1078. }
  1079. type CreateConfigParams struct {
  1080. ConfigName string `json:"config_name"`
  1081. Description string `json:"config_desc"`
  1082. WorkServerNum int `json:"worker_server_num"`
  1083. AppUrl string `json:"app_url"` //训练作业的代码目录
  1084. BootFileUrl string `json:"boot_file_url"` //训练作业的代码启动文件,需要在代码目录下
  1085. Parameter []Parameter `json:"parameter"`
  1086. DataUrl string `json:"data_url"` //训练作业需要的数据集OBS路径URL
  1087. EngineID int64 `json:"engine_id"`
  1088. TrainUrl string `json:"train_url"` //训练作业的输出文件OBS路径URL
  1089. LogUrl string `json:"log_url"`
  1090. Flavor Flavor `json:"flavor"`
  1091. PoolID string `json:"pool_id"`
  1092. Volumes []Volumes `json:"volumes"`
  1093. }
  1094. type Parameter struct {
  1095. Label string `json:"label"`
  1096. Value string `json:"value"`
  1097. }
  1098. type Parameters struct {
  1099. Parameter []Parameter `json:"parameter"`
  1100. }
  1101. type Datasurl struct {
  1102. DatasetUrl string `json:"dataset_url"`
  1103. DatasetName string `json:"dataset_name"`
  1104. }
  1105. type DatasetDownload struct {
  1106. DatasetName string `json:"dataset_name"`
  1107. DatasetDownloadLink string `json:"dataset_download_link"`
  1108. RepositoryLink string `json:"repository_link"`
  1109. IsDelete bool `json:"is_delete"`
  1110. }
  1111. type ModelDownload struct {
  1112. Name string `json:"name"`
  1113. DownloadLink string `json:"download_link"`
  1114. RepositoryLink string `json:"repository_link"`
  1115. IsDelete bool `json:"is_delete"`
  1116. }
  1117. type DataSource struct {
  1118. DatasetID string `json:"dataset_id"`
  1119. DatasetVersion string `json:"dataset_version"`
  1120. Type string `json:"type"`
  1121. DataUrl string `json:"data_url"`
  1122. }
  1123. type Volumes struct {
  1124. Nfs Nfs `json:"nfs"`
  1125. HostPath HostPath `json:"host_path"`
  1126. }
  1127. type Nfs struct {
  1128. ID string `json:"id"`
  1129. SourcePath string `json:"src_path"`
  1130. DestPath string `json:"dest_path"`
  1131. ReadOnly bool `json:"read_only"`
  1132. }
  1133. type HostPath struct {
  1134. SourcePath string `json:"src_path"`
  1135. DestPath string `json:"dest_path"`
  1136. ReadOnly bool `json:"read_only"`
  1137. }
  1138. type Flavor struct {
  1139. Code string `json:"code"`
  1140. }
  1141. type CreateTrainJobResult struct {
  1142. ErrorCode string `json:"error_code"`
  1143. ErrorMsg string `json:"error_msg"`
  1144. IsSuccess bool `json:"is_success"`
  1145. JobName string `json:"job_name"`
  1146. JobID int64 `json:"job_id"`
  1147. Status int `json:"status"`
  1148. CreateTime int64 `json:"create_time"`
  1149. VersionID int64 `json:"version_id"`
  1150. ResourceID string `json:"resource_id"`
  1151. VersionName string `json:"version_name"`
  1152. }
  1153. type CreateTrainJobConfigResult struct {
  1154. ErrorCode string `json:"error_code"`
  1155. ErrorMsg string `json:"error_msg"`
  1156. IsSuccess bool `json:"is_success"`
  1157. }
  1158. type GetResourceSpecsResult struct {
  1159. ErrorCode string `json:"error_code"`
  1160. ErrorMsg string `json:"error_msg"`
  1161. IsSuccess bool `json:"is_success"`
  1162. SpecTotalCount int `json:"spec_total_count"`
  1163. Specs []Specs `json:"specs"`
  1164. }
  1165. type Specs struct {
  1166. Core string `json:"core"`
  1167. Cpu string `json:"cpu"`
  1168. IsNoResource bool `json:"no_resource"`
  1169. GpuType string `json:"gpu_type"`
  1170. SpecID int64 `json:"spec_id"`
  1171. GpuNum int `json:"gpu_num"`
  1172. SpecCode string `json:"spec_code"`
  1173. Storage string `json:"storage"`
  1174. MaxNum int `json:"max_num"`
  1175. UnitNum int `json:"unit_num"`
  1176. InterfaceType int `json:"interface_type"`
  1177. }
  1178. type GetConfigListResult struct {
  1179. ErrorCode string `json:"error_code"`
  1180. ErrorMsg string `json:"error_msg"`
  1181. IsSuccess bool `json:"is_success"`
  1182. ConfigTotalCount int `json:"config_total_count"`
  1183. ParaConfigs []ParaConfig `json:"configs"`
  1184. }
  1185. type ParaConfig struct {
  1186. ConfigName string `json:"config_name"`
  1187. ConfigDesc string `json:"config_desc"`
  1188. CreateTime int64 `json:"create_time"`
  1189. EngineType int `json:"engine_type"`
  1190. EngineName string `json:"engine_name"`
  1191. EngineId int64 `json:"engine_id"`
  1192. EngineVersion string `json:"engine_version"`
  1193. UserImageUrl string `json:"user_image_url"`
  1194. UserCommand string `json:"user_command"`
  1195. Result GetConfigResult
  1196. }
  1197. type GetConfigResult struct {
  1198. ErrorCode string `json:"error_code"`
  1199. ErrorMsg string `json:"error_msg"`
  1200. IsSuccess bool `json:"is_success"`
  1201. ConfigName string `json:"config_name"`
  1202. Description string `json:"config_desc"`
  1203. WorkServerNum int `json:"worker_server_num"`
  1204. AppUrl string `json:"app_url"` //训练作业的代码目录
  1205. BootFileUrl string `json:"boot_file_url"` //训练作业的代码启动文件,需要在代码目录下
  1206. Parameter []Parameter `json:"parameter"`
  1207. DataUrl string `json:"data_url"` //训练作业需要的数据集OBS路径URL
  1208. EngineID int64 `json:"engine_id"`
  1209. TrainUrl string `json:"train_url"` //训练作业的输出文件OBS路径URL
  1210. LogUrl string `json:"log_url"`
  1211. Flavor Flavor `json:"flavor"`
  1212. PoolID string `json:"pool_id"`
  1213. }
  1214. type ErrorResult struct {
  1215. ErrorCode string `json:"error_code"`
  1216. ErrorMsg string `json:"error_message"`
  1217. IsSuccess bool `json:"is_success"`
  1218. }
  1219. type GetTrainJobResult struct {
  1220. IsSuccess bool `json:"is_success"`
  1221. JobName string `json:"job_name"`
  1222. JobID int64 `json:"job_id"`
  1223. Description string `json:"job_desc"`
  1224. IntStatus int `json:"status"`
  1225. Status string
  1226. LongCreateTime int64 `json:"create_time"`
  1227. CreateTime string
  1228. Duration int64 `json:"duration"` //训练作业的运行时间,单位为毫秒
  1229. TrainJobDuration string //训练作业的运行时间,格式为hh:mm:ss
  1230. VersionID int64 `json:"version_id"`
  1231. ResourceID string `json:"resource_id"`
  1232. VersionName string `json:"version_name"`
  1233. PreVersionID int64 `json:"pre_version_id"`
  1234. WorkServerNum int `json:"worker_server_num"`
  1235. AppUrl string `json:"app_url"` //训练作业的代码目录
  1236. BootFileUrl string `json:"boot_file_url"` //训练作业的代码启动文件,需要在代码目录下
  1237. Parameter []Parameter `json:"parameter"`
  1238. DataUrl string `json:"data_url"` //训练作业需要的数据集OBS路径URL
  1239. EngineID int64 `json:"engine_id"`
  1240. EngineName string `json:"engine_name"`
  1241. EngineVersion string `json:"engine_version"`
  1242. TrainUrl string `json:"train_url"` //训练作业的输出文件OBS路径URL
  1243. LogUrl string `json:"log_url"`
  1244. Flavor Flavor `json:"flavor"`
  1245. PoolID string `json:"pool_id"`
  1246. PoolName string `json:"pool_name"`
  1247. NasMountPath string `json:"nas_mount_path"`
  1248. NasShareAddr string `json:"nas_share_addr"`
  1249. DatasetName string
  1250. ModelMetricList string `json:"model_metric_list"` //列表里包含f1_score,recall,precision,accuracy,若有的话
  1251. StartTime int64 `json:"start_time"` //训练作业开始时间。
  1252. }
  1253. type GetTrainJobLogResult struct {
  1254. ErrorCode string `json:"error_code"`
  1255. ErrorMsg string `json:"error_msg"`
  1256. IsSuccess bool `json:"is_success"`
  1257. Content string `json:"content"`
  1258. Lines int `json:"lines"`
  1259. StartLine string `json:"start_line"`
  1260. EndLine string `json:"end_line"`
  1261. }
  1262. type GetTrainJobLogFileNamesResult struct {
  1263. ErrorCode string `json:"error_code"`
  1264. ErrorMsg string `json:"error_msg"`
  1265. IsSuccess bool `json:"is_success"`
  1266. LogFileList []string `json:"log_file_list"`
  1267. }
  1268. type TrainJobResult struct {
  1269. ErrorCode string `json:"error_code"`
  1270. ErrorMsg string `json:"error_msg"`
  1271. IsSuccess bool `json:"is_success"`
  1272. }
  1273. type LogFile struct {
  1274. Name string
  1275. }
  1276. type JobList struct {
  1277. JobName string `json:"job_name"`
  1278. JobID int64 `json:"job_id"`
  1279. VersionID int64 `json:"version_id"`
  1280. VersionCount int64 `json:"version_count"`
  1281. Description string `json:"job_desc"`
  1282. IntStatus int `json:"status"`
  1283. }
  1284. type GetTrainJobListResult struct {
  1285. ErrorResult
  1286. JobTotalCount int `json:"job_total_count"` //查询到的用户创建作业总数
  1287. JobCountLimit int `json:"job_count_limit"` //用户还可以创建训练作业的数量
  1288. Quotas int `json:"quotas"` //训练作业的运行数量上限
  1289. JobList []JobList `json:"jobs"`
  1290. }
  1291. type JobVersionList struct {
  1292. VersionName string `json:"version_name"`
  1293. VersionID int64 `json:"version_id"`
  1294. IntStatus int `json:"status"`
  1295. }
  1296. type GetTrainJobVersionListResult struct {
  1297. ErrorResult
  1298. JobID int64 `json:"job_id"`
  1299. JobName string `json:"job_name"`
  1300. JobDesc string `json:"job_desc"`
  1301. VersionCount int64 `json:"version_count"`
  1302. JobVersionList []JobVersionList `json:"versions"`
  1303. }
  1304. type NotebookList struct {
  1305. JobName string `json:"name"`
  1306. JobID string `json:"id"`
  1307. Status string `json:"status"`
  1308. }
  1309. type GetNotebookListResult struct {
  1310. TotalCount int64 `json:"total"` //总的记录数量
  1311. CurrentPage int `json:"current"` //当前页数
  1312. TotalPages int `json:"pages"` //总的页数
  1313. Size int `json:"size"` //每一页的数量
  1314. NotebookList []NotebookList `json:"data"`
  1315. }
  1316. // Grampus
  1317. type GrampusResult struct {
  1318. ErrorCode int `json:"errorCode"`
  1319. ErrorMsg string `json:"errorMsg"`
  1320. }
  1321. type GrampusJobInfo struct {
  1322. StartedAt int64 `json:"startedAt"`
  1323. RunSec int64 `json:"runSec"`
  1324. CompletedAt int64 `json:"completedAt"`
  1325. CreatedAt int64 `json:"createdAt"`
  1326. UpdatedAt int64 `json:"updatedAt"`
  1327. Desc string `json:"desc"`
  1328. JobID string `json:"id"`
  1329. Name string `json:"name"`
  1330. Status string `json:"status"`
  1331. UserID string `json:"userId"`
  1332. Tasks []GrampusTasks `json:"tasks"`
  1333. }
  1334. type GrampusNotebookInfo struct {
  1335. StartedAt int64 `json:"startedAt"`
  1336. RunSec int64 `json:"runSec"`
  1337. CompletedAt int64 `json:"completedAt"`
  1338. CreatedAt int64 `json:"createdAt"`
  1339. UpdatedAt int64 `json:"updatedAt"`
  1340. Desc string `json:"desc"`
  1341. JobID string `json:"id"`
  1342. Name string `json:"name"`
  1343. Status string `json:"status"`
  1344. UserID string `json:"userId"`
  1345. Tasks []GrampusNotebookTask `json:"tasks"`
  1346. }
  1347. type Center struct {
  1348. ID string `json:"id"`
  1349. Name string `json:"name"`
  1350. }
  1351. type GrampusSpec struct {
  1352. CreatedAt int64 `json:"createdAt"`
  1353. UpdatedAt int64 `json:"updatedAt"`
  1354. ID string `json:"id"`
  1355. Name string `json:"name"`
  1356. ProcessorType string `json:"processorType"`
  1357. Centers []Center `json:"centers"`
  1358. SpecInfo SpecInfo `json:"specInfo"`
  1359. }
  1360. type GrampusAiCenter struct {
  1361. AccDevices []GrampusAccDevice `json:"accDevices"`
  1362. Id string `json:"id"`
  1363. Name string `json:"name"`
  1364. Resource []GrampusCenterResource `json:"resource"`
  1365. }
  1366. type GrampusAccDevice struct {
  1367. Kind string `json:"kind"` //加速卡类别, npu.huawei.com/NPU,nvidia.com/gpu,cambricon.com/mlu
  1368. Model string `json:"model"` //加速卡型号
  1369. }
  1370. type GrampusCenterResource struct {
  1371. Allocated string `json:"allocated"`
  1372. Capacity string `json:"capacity"`
  1373. Name string `json:"name"`
  1374. }
  1375. type SpecInfo struct {
  1376. AccDeviceKind string `json:"accDeviceKind"`
  1377. AccDeviceMemory string `json:"accDeviceMemory"`
  1378. AccDeviceModel string `json:"accDeviceModel"`
  1379. AccDeviceNum int `json:"accDeviceNum"`
  1380. CpuCoreNum int `json:"cpuCoreNum"`
  1381. MemorySize string `json:"memorySize"`
  1382. }
  1383. type GetGrampusResourceSpecsResult struct {
  1384. GrampusResult
  1385. Infos []GrampusSpec `json:"resourceSpecs"`
  1386. }
  1387. type GetGrampusAiCentersResult struct {
  1388. GrampusResult
  1389. Infos []GrampusAiCenter `json:"aiCenterInfos"`
  1390. TotalSize int `json:"totalSize"`
  1391. }
  1392. type GrampusImage struct {
  1393. CreatedAt int64 `json:"createdAt"`
  1394. UpdatedAt int64 `json:"updatedAt"`
  1395. ID string `json:"id"`
  1396. Name string `json:"name"`
  1397. ProcessorType string `json:"processorType"`
  1398. }
  1399. type GetGrampusImagesResult struct {
  1400. GrampusResult
  1401. TotalSize int `json:"totalSize"`
  1402. Infos []GrampusImage `json:"images"`
  1403. }
  1404. type CreateGrampusJobResponse struct {
  1405. GrampusResult
  1406. JobInfo GrampusJobInfo `json:"otJob"`
  1407. }
  1408. type GetGrampusJobResponse struct {
  1409. GrampusResult
  1410. JobInfo GrampusJobInfo `json:"otJob"`
  1411. ExitDiagnostics string `json:"exitDiagnostics"`
  1412. }
  1413. type GrampusNotebookResponse struct {
  1414. GrampusResult
  1415. JobInfo GrampusNotebookInfo `json:"otJob"`
  1416. }
  1417. type GrampusNotebookRestartResponse struct {
  1418. GrampusResult
  1419. NewId string `json:"newId"`
  1420. Status string `json:"status"`
  1421. }
  1422. type GrampusStopJobResponse struct {
  1423. GrampusResult
  1424. StoppedAt int64 `json:"stoppedAt"`
  1425. ID string `json:"id"`
  1426. Status string `json:"status"`
  1427. }
  1428. type GrampusTasks struct {
  1429. Command string `json:"command"`
  1430. Name string `json:"name"`
  1431. ImageId string `json:"imageId"`
  1432. ResourceSpecId string `json:"resourceSpecId"`
  1433. ImageUrl string `json:"imageUrl"`
  1434. CenterID []string `json:"centerID"`
  1435. CenterName []string `json:"centerName"`
  1436. ReplicaNum int `json:"replicaNum"`
  1437. Datasets []GrampusDataset `json:"datasets"`
  1438. Models []GrampusDataset `json:"models"`
  1439. Code GrampusDataset `json:"code"`
  1440. BootFile string `json:"bootFile"`
  1441. }
  1442. type GrampusNotebookTask struct {
  1443. AutoStopDuration int `json:"autoStopDuration"`
  1444. Name string `json:"name"`
  1445. Capacity int `json:"capacity"`
  1446. CenterID []string `json:"centerID"`
  1447. CenterName []string `json:"centerName"`
  1448. Code GrampusDataset `json:"code"`
  1449. Datasets []GrampusDataset `json:"datasets"`
  1450. CodeUrl string `json:"codeUrl"`
  1451. DataUrl string `json:"dataUrl"`
  1452. ImageId string `json:"imageId"`
  1453. ImageUrl string `json:"imageUrl"`
  1454. ResourceSpecId string `json:"resourceSpecId"`
  1455. Token string `json:"token"`
  1456. Url string `json:"url"`
  1457. Status string `json:"status"`
  1458. Command string `json:"command"`
  1459. }
  1460. type GrampusDataset struct {
  1461. Name string `json:"name"`
  1462. Bucket string `json:"bucket"`
  1463. EndPoint string `json:"endPoint"`
  1464. ObjectKey string `json:"objectKey"`
  1465. ContainerPath string `json:"containerPath"`
  1466. ReadOnly bool `json:"readOnly"`
  1467. }
  1468. type CreateGrampusJobRequest struct {
  1469. Name string `json:"name"`
  1470. Tasks []GrampusTasks `json:"tasks"`
  1471. }
  1472. type CreateGrampusNotebookRequest struct {
  1473. Name string `json:"name"`
  1474. Tasks []GrampusNotebookTask `json:"tasks"`
  1475. }
  1476. type GetTrainJobMetricStatisticResult struct {
  1477. TrainJobResult
  1478. Interval int `json:"interval"` //查询的时间间隔,单位为分钟
  1479. MetricsInfo []Metrics `json:"metrics"` //监控详情
  1480. }
  1481. type Metrics struct {
  1482. Metric string `json:"metric"` //监控指标项
  1483. Value []string `json:"value"` //获取的监控值的序列,元素为String类型
  1484. }
  1485. func Cloudbrains(opts *CloudbrainsOptions) ([]*CloudbrainInfo, int64, error) {
  1486. sess := x.NewSession()
  1487. defer sess.Close()
  1488. var cond = builder.NewCond()
  1489. if opts.RepoID > 0 {
  1490. cond = cond.And(
  1491. builder.Eq{"cloudbrain.repo_id": opts.RepoID},
  1492. )
  1493. }
  1494. if opts.UserID > 0 {
  1495. cond = cond.And(
  1496. builder.Eq{"cloudbrain.user_id": opts.UserID},
  1497. )
  1498. }
  1499. if (opts.JobID) != "" {
  1500. cond = cond.And(
  1501. builder.Eq{"cloudbrain.job_id": opts.JobID},
  1502. )
  1503. }
  1504. if (opts.ComputeResource) != "" {
  1505. cond = cond.And(
  1506. builder.Eq{"cloudbrain.compute_resource": opts.ComputeResource},
  1507. )
  1508. }
  1509. if (opts.Type) >= 0 {
  1510. cond = cond.And(
  1511. builder.Eq{"cloudbrain.type": opts.Type},
  1512. )
  1513. }
  1514. if len(opts.JobTypes) > 0 {
  1515. if opts.JobTypeNot {
  1516. cond = cond.And(
  1517. builder.NotIn("cloudbrain.job_type", opts.JobTypes),
  1518. )
  1519. } else {
  1520. cond = cond.And(
  1521. builder.In("cloudbrain.job_type", opts.JobTypes),
  1522. )
  1523. }
  1524. }
  1525. if (opts.AiCenter) != "" {
  1526. if opts.AiCenter == AICenterOfCloudBrainOne {
  1527. cond = cond.And(
  1528. builder.Eq{"cloudbrain.type": TypeCloudBrainOne},
  1529. )
  1530. } else if opts.AiCenter == AICenterOfCloudBrainTwo {
  1531. cond = cond.And(
  1532. builder.Eq{"cloudbrain.type": TypeCloudBrainTwo},
  1533. )
  1534. } else if opts.AiCenter == AICenterOfChengdu {
  1535. cond = cond.And(
  1536. builder.Eq{"cloudbrain.type": TypeCDCenter},
  1537. )
  1538. } else {
  1539. cond = cond.And(
  1540. builder.Like{"cloudbrain.ai_center", opts.AiCenter},
  1541. )
  1542. }
  1543. }
  1544. if (opts.Cluster) != "" {
  1545. if opts.Cluster == "resource_cluster_openi" {
  1546. cond = cond.And(
  1547. builder.Or(builder.Eq{"cloudbrain.type": TypeCloudBrainOne}, builder.Eq{"cloudbrain.type": TypeCloudBrainTwo}, builder.Eq{"cloudbrain.type": TypeCDCenter}),
  1548. )
  1549. }
  1550. if opts.Cluster == "resource_cluster_c2net" {
  1551. cond = cond.And(
  1552. builder.Eq{"cloudbrain.type": TypeC2Net},
  1553. )
  1554. }
  1555. }
  1556. if (opts.IsLatestVersion) != "" {
  1557. cond = cond.And(builder.Or(builder.And(builder.Eq{"cloudbrain.is_latest_version": opts.IsLatestVersion}, builder.Eq{"cloudbrain.job_type": "TRAIN"}), builder.Neq{"cloudbrain.job_type": "TRAIN"}))
  1558. }
  1559. if len(opts.CloudbrainIDs) > 0 {
  1560. cond = cond.And(builder.In("cloudbrain.id", opts.CloudbrainIDs))
  1561. }
  1562. if len(opts.JobStatus) > 0 {
  1563. if opts.JobStatusNot {
  1564. cond = cond.And(
  1565. builder.NotIn("cloudbrain.status", opts.JobStatus),
  1566. )
  1567. } else {
  1568. cond = cond.And(
  1569. builder.In("cloudbrain.status", opts.JobStatus),
  1570. )
  1571. }
  1572. }
  1573. if len(opts.RepoIDList) > 0 {
  1574. cond = cond.And(
  1575. builder.In("cloudbrain.repo_id", opts.RepoIDList),
  1576. )
  1577. }
  1578. var count int64
  1579. var err error
  1580. condition := "cloudbrain.user_id = `user`.id"
  1581. if len(opts.Keyword) == 0 {
  1582. count, err = sess.Where(cond).Count(new(Cloudbrain))
  1583. } else {
  1584. lowerKeyWord := strings.ToLower(opts.Keyword)
  1585. cond = cond.And(builder.Or(builder.Like{"LOWER(cloudbrain.job_name)", lowerKeyWord}, builder.Like{"LOWER(cloudbrain.display_job_name)", lowerKeyWord}, builder.Like{"`user`.lower_name", lowerKeyWord}))
  1586. count, err = sess.Table(&Cloudbrain{}).Where(cond).
  1587. Join("left", "`user`", condition).Count(new(CloudbrainInfo))
  1588. }
  1589. if err != nil {
  1590. return nil, 0, fmt.Errorf("Count: %v", err)
  1591. }
  1592. if opts.Page >= 0 && opts.PageSize > 0 {
  1593. var start int
  1594. if opts.Page == 0 {
  1595. start = 0
  1596. } else {
  1597. start = (opts.Page - 1) * opts.PageSize
  1598. }
  1599. sess.Limit(opts.PageSize, start)
  1600. }
  1601. sess.OrderBy("cloudbrain.created_unix DESC")
  1602. cloudbrains := make([]*CloudbrainInfo, 0, setting.UI.IssuePagingNum)
  1603. if err := sess.Table(&Cloudbrain{}).Where(cond).
  1604. Join("left", "`user`", condition).
  1605. Find(&cloudbrains); err != nil {
  1606. return nil, 0, fmt.Errorf("Find: %v", err)
  1607. }
  1608. if opts.NeedRepoInfo {
  1609. var ids []int64
  1610. for _, task := range cloudbrains {
  1611. ids = append(ids, task.RepoID)
  1612. }
  1613. repositoryMap, err := GetRepositoriesMapByIDs(ids)
  1614. if err == nil {
  1615. for _, task := range cloudbrains {
  1616. task.Repo = repositoryMap[task.RepoID]
  1617. }
  1618. }
  1619. }
  1620. return cloudbrains, count, nil
  1621. }
  1622. func QueryModelTrainJobVersionList(jobId string) ([]*Cloudbrain, int, error) {
  1623. sess := x.NewSession()
  1624. defer sess.Close()
  1625. var cond = builder.NewCond()
  1626. cond = cond.And(
  1627. builder.Eq{"cloudbrain.job_id": jobId},
  1628. )
  1629. cond = cond.And(
  1630. builder.In("cloudbrain.Status", "COMPLETED", "SUCCEEDED"),
  1631. //builder.Eq{"cloudbrain.Status": "COMPLETED"},
  1632. )
  1633. sess.OrderBy("cloudbrain.created_unix DESC")
  1634. cloudbrains := make([]*Cloudbrain, 0)
  1635. if err := sess.Table(&Cloudbrain{}).Where(cond).
  1636. Find(&cloudbrains); err != nil {
  1637. return nil, 0, fmt.Errorf("Find: %v", err)
  1638. }
  1639. return cloudbrains, int(len(cloudbrains)), nil
  1640. }
  1641. func QueryModelTrainJobList(repoId int64) ([]*Cloudbrain, int, error) {
  1642. sess := x.NewSession()
  1643. defer sess.Close()
  1644. var cond = builder.NewCond()
  1645. cond = cond.And(
  1646. builder.Eq{"repo_id": repoId},
  1647. )
  1648. cond = cond.And(
  1649. builder.In("Status", "COMPLETED", "SUCCEEDED"),
  1650. )
  1651. cond = cond.And(
  1652. builder.Eq{"job_type": "TRAIN"},
  1653. )
  1654. // cond = cond.And(
  1655. // builder.In("type", 0, 1),
  1656. // )
  1657. cloudbrains := make([]*Cloudbrain, 0)
  1658. if err := sess.Select("*").Table(&Cloudbrain{}).Where(cond).OrderBy("created_unix DESC").
  1659. Find(&cloudbrains); err != nil {
  1660. return nil, 0, fmt.Errorf("Find: %v", err)
  1661. }
  1662. keys := make(map[string]string)
  1663. uniqueElements := make([]*Cloudbrain, 0)
  1664. for _, entry := range cloudbrains {
  1665. if _, value := keys[entry.JobID]; !value {
  1666. keys[entry.JobID] = entry.DisplayJobName
  1667. uniqueElements = append(uniqueElements, entry)
  1668. }
  1669. }
  1670. return uniqueElements, int(len(uniqueElements)), nil
  1671. }
  1672. func CloudbrainsVersionList(opts *CloudbrainsOptions) ([]*CloudbrainInfo, int, error) {
  1673. sess := x.NewSession()
  1674. defer sess.Close()
  1675. var cond = builder.NewCond()
  1676. if opts.RepoID > 0 {
  1677. cond = cond.And(
  1678. builder.Eq{"cloudbrain.repo_id": opts.RepoID},
  1679. )
  1680. }
  1681. if opts.UserID > 0 {
  1682. cond = cond.And(
  1683. builder.Eq{"cloudbrain.user_id": opts.UserID},
  1684. )
  1685. }
  1686. if (opts.Type) >= 0 {
  1687. cond = cond.And(
  1688. builder.Eq{"cloudbrain.type": opts.Type},
  1689. )
  1690. }
  1691. if (opts.JobID) != "" {
  1692. cond = cond.And(
  1693. builder.Eq{"cloudbrain.job_id": opts.JobID},
  1694. )
  1695. }
  1696. if len(opts.JobTypes) > 0 {
  1697. cond = cond.And(
  1698. builder.In("cloudbrain.job_type", opts.JobTypes),
  1699. )
  1700. }
  1701. if len(opts.CloudbrainIDs) > 0 {
  1702. cond = cond.And(builder.In("cloudbrain.id", opts.CloudbrainIDs))
  1703. }
  1704. count, err := sess.Where(cond).Count(new(Cloudbrain))
  1705. if err != nil {
  1706. return nil, 0, fmt.Errorf("Count: %v", err)
  1707. }
  1708. if opts.Page >= 0 && opts.PageSize > 0 {
  1709. var start int
  1710. if opts.Page == 0 {
  1711. start = 0
  1712. } else {
  1713. start = (opts.Page - 1) * opts.PageSize
  1714. }
  1715. sess.Limit(opts.PageSize, start)
  1716. }
  1717. sess.OrderBy("cloudbrain.created_unix DESC")
  1718. cloudbrains := make([]*CloudbrainInfo, 0, setting.UI.IssuePagingNum)
  1719. if err := sess.Table(&Cloudbrain{}).Where(cond).
  1720. Join("left", "`user`", "cloudbrain.user_id = `user`.id").
  1721. Find(&cloudbrains); err != nil {
  1722. return nil, 0, fmt.Errorf("Find: %v", err)
  1723. }
  1724. return cloudbrains, int(count), nil
  1725. }
  1726. func CreateCloudbrain(cloudbrain *Cloudbrain) (err error) {
  1727. session := x.NewSession()
  1728. defer session.Close()
  1729. err = session.Begin()
  1730. cloudbrain.TrainJobDuration = DURATION_STR_ZERO
  1731. if _, err = session.NoAutoTime().InsertOne(cloudbrain); err != nil {
  1732. session.Rollback()
  1733. return err
  1734. }
  1735. if cloudbrain.Spec != nil {
  1736. if _, err = session.Insert(NewCloudBrainSpec(cloudbrain.ID, *cloudbrain.Spec)); err != nil {
  1737. session.Rollback()
  1738. return err
  1739. }
  1740. }
  1741. session.Commit()
  1742. go IncreaseDatasetUseCount(cloudbrain.Uuid)
  1743. go OperateRepoAITaskNum(cloudbrain.RepoID, 1)
  1744. return nil
  1745. }
  1746. func getRepoCloudBrain(cb *Cloudbrain) (*Cloudbrain, error) {
  1747. has, err := x.Get(cb)
  1748. if err != nil {
  1749. return nil, err
  1750. } else if !has {
  1751. return nil, ErrJobNotExist{}
  1752. }
  1753. return cb, nil
  1754. }
  1755. func getRepoCloudBrainWithDeleted(cb *Cloudbrain) (*Cloudbrain, error) {
  1756. has, err := x.Unscoped().Get(cb)
  1757. if err != nil {
  1758. return nil, err
  1759. } else if !has {
  1760. return nil, ErrJobNotExist{}
  1761. }
  1762. return cb, nil
  1763. }
  1764. func GetRepoCloudBrainByJobID(repoID int64, jobID string) (*Cloudbrain, error) {
  1765. cb := &Cloudbrain{JobID: jobID, RepoID: repoID}
  1766. return getRepoCloudBrain(cb)
  1767. }
  1768. func GetCloudbrainByJobID(jobID string) (*Cloudbrain, error) {
  1769. cb := &Cloudbrain{JobID: jobID}
  1770. return getRepoCloudBrain(cb)
  1771. }
  1772. func GetCloudbrainByJobIDWithDeleted(jobID string) (*Cloudbrain, error) {
  1773. cb := &Cloudbrain{JobID: jobID}
  1774. return getRepoCloudBrainWithDeleted(cb)
  1775. }
  1776. func GetCloudbrainByID(id string) (*Cloudbrain, error) {
  1777. idInt64, _ := strconv.ParseInt(id, 10, 64)
  1778. cb := &Cloudbrain{ID: idInt64}
  1779. return getRepoCloudBrain(cb)
  1780. }
  1781. func IsCloudbrainExistByJobName(jobName string) (bool, error) {
  1782. return x.Unscoped().Exist(&Cloudbrain{
  1783. JobName: jobName,
  1784. })
  1785. }
  1786. func GetCloudbrainByIDWithDeleted(id string) (*Cloudbrain, error) {
  1787. idInt64, _ := strconv.ParseInt(id, 10, 64)
  1788. cb := &Cloudbrain{ID: idInt64}
  1789. return getRepoCloudBrainWithDeleted(cb)
  1790. }
  1791. func GetCloudbrainByJobIDAndVersionName(jobID string, versionName string) (*Cloudbrain, error) {
  1792. cb := &Cloudbrain{JobID: jobID, VersionName: versionName}
  1793. return getRepoCloudBrain(cb)
  1794. }
  1795. func GetCloudbrainByJobIDAndIsLatestVersion(jobID string, isLatestVersion string) (*Cloudbrain, error) {
  1796. cb := &Cloudbrain{JobID: jobID, IsLatestVersion: isLatestVersion}
  1797. return getRepoCloudBrain(cb)
  1798. }
  1799. func GetCloudbrainsNeededStopByUserID(userID int64) ([]*Cloudbrain, error) {
  1800. cloudBrains := make([]*Cloudbrain, 0)
  1801. err := x.Cols("job_id", "status", "type", "job_type", "version_id", "start_time").Where("user_id=? AND status !=?", userID, string(JobStopped)).Find(&cloudBrains)
  1802. return cloudBrains, err
  1803. }
  1804. func GetModelartsReDebugTaskByJobId(jobID string) ([]*Cloudbrain, error) {
  1805. sess := x.NewSession()
  1806. defer sess.Close()
  1807. var cond = builder.NewCond()
  1808. cond = cond.And(
  1809. builder.Eq{"cloudbrain.job_id": jobID},
  1810. )
  1811. sess.OrderBy("cloudbrain.created_unix ASC limit 1")
  1812. cloudbrains := make([]*Cloudbrain, 0, 10)
  1813. if err := sess.Table(&Cloudbrain{}).Unscoped().Where(cond).
  1814. Find(&cloudbrains); err != nil {
  1815. log.Info("find error.")
  1816. }
  1817. return cloudbrains, nil
  1818. }
  1819. func GetCloudbrainsNeededStopByRepoID(repoID int64) ([]*Cloudbrain, error) {
  1820. cloudBrains := make([]*Cloudbrain, 0)
  1821. err := x.Cols("job_id", "status", "type", "job_type", "version_id", "start_time").Where("repo_id=? AND status !=?", repoID, string(JobStopped)).Find(&cloudBrains)
  1822. return cloudBrains, err
  1823. }
  1824. func GetCloudbrainsNeededDeleteByRepoID(repoID int64) ([]*Cloudbrain, error) {
  1825. cloudBrains := make([]*Cloudbrain, 0)
  1826. err := x.Where("repo_id=?", repoID).Find(&cloudBrains)
  1827. return cloudBrains, err
  1828. }
  1829. func GetCloudbrainsByDisplayJobName(repoID int64, jobType string, displayJobName string) ([]*Cloudbrain, error) {
  1830. cloudBrains := make([]*Cloudbrain, 0)
  1831. err := x.Cols("job_id", "job_name", "repo_id", "user_id", "job_type", "display_job_name").Where("repo_id=? AND job_type =? AND lower(display_job_name) = lower(?)", repoID, jobType, displayJobName).Find(&cloudBrains)
  1832. return cloudBrains, err
  1833. }
  1834. func SetCloudbrainStatusByJobID(jobID string, status CloudbrainStatus) (err error) {
  1835. cb := &Cloudbrain{JobID: jobID, Status: string(status)}
  1836. _, err = x.Cols("status").Where("cloudbrain.job_id=?", jobID).Update(cb)
  1837. return
  1838. }
  1839. func SetTrainJobStatusByJobID(jobID string, status string, duration int64, trainjobduration string) (err error) {
  1840. cb := &Cloudbrain{JobID: jobID, Status: string(status), Duration: duration, TrainJobDuration: trainjobduration}
  1841. _, err = x.Cols("status", "duration", "train_job_duration").Where("cloudbrain.job_id=?", jobID).Update(cb)
  1842. return
  1843. }
  1844. func SetVersionCountAndLatestVersion(jobID string, versionName string, versionCount int, isLatestVersion string, totalVersionCount int) (err error) {
  1845. cb := &Cloudbrain{JobID: jobID, VersionName: versionName, VersionCount: versionCount, IsLatestVersion: isLatestVersion, TotalVersionCount: totalVersionCount}
  1846. _, err = x.Cols("version_Count", "is_latest_version", "total_version_count").Where("cloudbrain.job_id=? AND cloudbrain.version_name=?", jobID, versionName).Update(cb)
  1847. return
  1848. }
  1849. func UpdateJob(job *Cloudbrain) error {
  1850. return updateJob(x, job)
  1851. }
  1852. func UpdateJobDurationWithDeleted(job *Cloudbrain) error {
  1853. _, err := x.Exec("update cloudbrain set start_time=?, end_time=?,train_job_duration=?,duration=? where id=?", job.StartTime, job.EndTime, job.TrainJobDuration, job.Duration, job.ID)
  1854. return err
  1855. }
  1856. func updateJob(e Engine, job *Cloudbrain) error {
  1857. _, err := e.ID(job.ID).AllCols().Update(job)
  1858. return err
  1859. }
  1860. func UpdateTrainJobVersion(job *Cloudbrain) error {
  1861. return updateJobTrainVersion(x, job)
  1862. }
  1863. func updateJobTrainVersion(e Engine, job *Cloudbrain) error {
  1864. var sess *xorm.Session
  1865. sess = e.Where("job_id = ? AND version_name=?", job.JobID, job.VersionName)
  1866. _, err := sess.Cols("status", "train_job_duration", "duration", "start_time", "end_time", "created_unix", "ai_center").Update(job)
  1867. return err
  1868. }
  1869. func DeleteJob(job *Cloudbrain) error {
  1870. return deleteJob(x, job)
  1871. }
  1872. func deleteJob(e Engine, job *Cloudbrain) error {
  1873. _, err := e.ID(job.ID).Delete(job)
  1874. if err == nil {
  1875. go updateAITaskNumWhenDeleteJob(job)
  1876. }
  1877. return err
  1878. }
  1879. func updateAITaskNumWhenDeleteJob(job *Cloudbrain) {
  1880. repoId := job.RepoID
  1881. if repoId == 0 {
  1882. t := &Cloudbrain{}
  1883. _, tempErr := x.ID(job.ID).Unscoped().Get(t)
  1884. if tempErr != nil {
  1885. log.Error("updateAITaskNumWhenDeleteJob error.%v", tempErr)
  1886. return
  1887. }
  1888. repoId = t.RepoID
  1889. }
  1890. if repoId > 0 {
  1891. go OperateRepoAITaskNum(repoId, -1)
  1892. }
  1893. }
  1894. func GetCloudbrainByName(jobName string) (*Cloudbrain, error) {
  1895. cb := &Cloudbrain{JobName: jobName}
  1896. return getRepoCloudBrain(cb)
  1897. }
  1898. func GetWaitOrRunFileNotebookByRepo(repoId int64, cloudbrainType int) (*Cloudbrain, error) {
  1899. cloudBrain := new(Cloudbrain)
  1900. has, err := x.In("status", JobWaiting, JobRunning, ModelArtsCreateQueue, ModelArtsCreating, ModelArtsStarting,
  1901. ModelArtsReadyToStart, ModelArtsResizing, ModelArtsStartQueuing, ModelArtsRunning, ModelArtsDeleting, ModelArtsRestarting).Where("repo_id=? and type=? and boot_file!=''", repoId, cloudbrainType).Get(cloudBrain)
  1902. if has {
  1903. return cloudBrain, err
  1904. }
  1905. return nil, err
  1906. }
  1907. func CanDelJob(isSigned bool, user *User, job *CloudbrainInfo) bool {
  1908. if !isSigned || (job.Status != string(JobStopped) && job.Status != string(JobFailed) && job.Status != string(ModelArtsStartFailed) && job.Status != string(ModelArtsCreateFailed)) {
  1909. return false
  1910. }
  1911. repo, err := GetRepositoryByID(job.RepoID)
  1912. if err != nil {
  1913. log.Error("GetRepositoryByID failed:%v", err.Error())
  1914. return false
  1915. }
  1916. permission, _ := GetUserRepoPermission(repo, user)
  1917. if err != nil {
  1918. log.Error("GetUserRepoPermission failed:%v", err.Error())
  1919. return false
  1920. }
  1921. if (user.ID == job.UserID && permission.AccessMode >= AccessModeWrite) || user.IsAdmin || permission.AccessMode >= AccessModeAdmin {
  1922. return true
  1923. }
  1924. return false
  1925. }
  1926. func GetCloudBrainUnStoppedJob() ([]*Cloudbrain, error) {
  1927. cloudbrains := make([]*Cloudbrain, 0, 10)
  1928. return cloudbrains, x.
  1929. NotIn("status",
  1930. JobStopped, JobSucceeded, JobFailed, ModelArtsCreateFailed, ModelArtsStartFailed, ModelArtsUnavailable, ModelArtsResizFailed, ModelArtsDeleted,
  1931. ModelArtsStopped, ModelArtsTrainJobCanceled, ModelArtsTrainJobCheckFailed, ModelArtsTrainJobCompleted, ModelArtsTrainJobDeleteFailed, ModelArtsTrainJobDeployServiceFailed,
  1932. ModelArtsTrainJobFailed, ModelArtsTrainJobImageFailed, ModelArtsTrainJobKilled, ModelArtsTrainJobLost, ModelArtsTrainJobSubmitFailed, ModelArtsTrainJobSubmitModelFailed).
  1933. Limit(100).
  1934. Find(&cloudbrains)
  1935. }
  1936. func GetGPUStoppedNotDebugJobDaysAgo(days int, limit int) ([]*Cloudbrain, error) {
  1937. cloudbrains := make([]*Cloudbrain, 0, 10)
  1938. endTimeBefore := time.Now().Unix() - int64(days)*24*3600
  1939. missEndTimeBefore := endTimeBefore - 24*3600
  1940. return cloudbrains, x.Unscoped().Cols("id,job_name,job_id").
  1941. In("status",
  1942. JobStopped, JobSucceeded, JobFailed, ModelArtsCreateFailed, ModelArtsStartFailed, ModelArtsUnavailable, ModelArtsResizFailed, ModelArtsDeleted,
  1943. ModelArtsStopped, ModelArtsTrainJobCanceled, ModelArtsTrainJobCheckFailed, ModelArtsTrainJobCompleted, ModelArtsTrainJobDeleteFailed, ModelArtsTrainJobDeployServiceFailed,
  1944. ModelArtsTrainJobFailed, ModelArtsTrainJobImageFailed, ModelArtsTrainJobKilled, ModelArtsTrainJobLost, ModelArtsTrainJobSubmitFailed, ModelArtsTrainJobSubmitModelFailed).
  1945. Where("(((end_time is null or end_time=0) and updated_unix<? and updated_unix != 0 ) or (end_time<? and end_time != 0)) and cleared=false and (type=0 or (type =2 and compute_resource='CPU/GPU')) and job_type != 'DEBUG'", missEndTimeBefore, endTimeBefore).
  1946. Limit(limit).
  1947. Find(&cloudbrains)
  1948. }
  1949. /*
  1950. *
  1951. 本方法考虑了再次调试的情况,多次调试取最后一次的任务的结束时间
  1952. */
  1953. func GetGPUStoppedDebugJobDaysAgo(days int, limit int) ([]*Cloudbrain, error) {
  1954. cloudbrains := make([]*Cloudbrain, 0, 10)
  1955. endTimeBefore := time.Now().Unix() - int64(days)*24*3600
  1956. missEndTimeBefore := endTimeBefore - 24*3600
  1957. sql := `SELECT id,job_name,job_id from (SELECT DISTINCT ON (job_name)
  1958. id, job_name, job_id,status,end_time,updated_unix,cleared
  1959. FROM cloudbrain
  1960. where (type=0 or (type =2 and compute_resource='CPU/GPU')) and job_type='DEBUG'
  1961. ORDER BY job_name, updated_unix DESC) a
  1962. where status in ('STOPPED','SUCCEEDED','FAILED') and (((end_time is null or end_time=0) and updated_unix<? and updated_unix != 0 ) or (end_time<? and end_time != 0)) and cleared=false`
  1963. return cloudbrains, x.Unscoped().SQL(sql, missEndTimeBefore, endTimeBefore).Limit(limit).Find(&cloudbrains)
  1964. }
  1965. func UpdateCloudBrainRecordsCleared(ids []int64) error {
  1966. pageSize := 150
  1967. n := len(ids) / pageSize
  1968. var err error
  1969. for i := 1; i <= n+1; i++ {
  1970. tempIds := getPageIds(ids, i, pageSize)
  1971. if len(tempIds) > 0 {
  1972. idsIn := ""
  1973. for i, id := range tempIds {
  1974. if i == 0 {
  1975. idsIn += strconv.FormatInt(id, 10)
  1976. } else {
  1977. idsIn += "," + strconv.FormatInt(id, 10)
  1978. }
  1979. }
  1980. _, errTemp := x.Unscoped().Exec("update cloudbrain set cleared=true where id in (" + idsIn + ")")
  1981. if errTemp != nil {
  1982. err = errTemp
  1983. }
  1984. }
  1985. }
  1986. return err
  1987. }
  1988. func getPageIds(ids []int64, page int, pagesize int) []int64 {
  1989. begin := (page - 1) * pagesize
  1990. end := (page) * pagesize
  1991. if begin > len(ids)-1 {
  1992. return []int64{}
  1993. }
  1994. if end > len(ids)-1 {
  1995. return ids[begin:]
  1996. } else {
  1997. return ids[begin:end]
  1998. }
  1999. }
  2000. func GetStoppedJobWithNoDurationJob() ([]*Cloudbrain, error) {
  2001. cloudbrains := make([]*Cloudbrain, 0)
  2002. return cloudbrains, x.
  2003. In("status", ModelArtsTrainJobCompleted, ModelArtsTrainJobFailed, ModelArtsTrainJobKilled, ModelArtsStopped, JobStopped, JobFailed, JobSucceeded).
  2004. Where("train_job_duration is null or train_job_duration = '' ").
  2005. Limit(100).
  2006. Find(&cloudbrains)
  2007. }
  2008. func GetStoppedJobWithNoStartTimeEndTime() ([]*Cloudbrain, error) {
  2009. cloudbrains := make([]*Cloudbrain, 0)
  2010. return cloudbrains, x.SQL("select * from cloudbrain where status in (?,?,?,?,?,?,?) and (start_time is null or end_time is null) limit 100", ModelArtsTrainJobCompleted, ModelArtsTrainJobFailed, ModelArtsTrainJobKilled, ModelArtsStopped, JobStopped, JobFailed, JobSucceeded).Find(&cloudbrains)
  2011. }
  2012. func GetC2NetWithAiCenterWrongJob() ([]*Cloudbrain, error) {
  2013. cloudbrains := make([]*Cloudbrain, 0)
  2014. return cloudbrains, x.
  2015. In("status", ModelArtsTrainJobCompleted, ModelArtsTrainJobFailed, ModelArtsTrainJobKilled, ModelArtsStopped, JobStopped, JobFailed, JobSucceeded).
  2016. Where("type = ?", TypeC2Net).
  2017. Find(&cloudbrains)
  2018. }
  2019. func GetModelSafetyTestTask() ([]*Cloudbrain, error) {
  2020. cloudbrains := make([]*Cloudbrain, 0)
  2021. sess := x.Where("job_type=?", string(JobTypeModelSafety))
  2022. err := sess.Find(&cloudbrains)
  2023. return cloudbrains, err
  2024. }
  2025. func GetCloudbrainRunCountByRepoID(repoID int64) (int, error) {
  2026. count, err := x.In("status", JobWaiting, JobRunning, ModelArtsCreateQueue, ModelArtsCreating, ModelArtsStarting,
  2027. ModelArtsReadyToStart, ModelArtsResizing, ModelArtsStartQueuing, ModelArtsRunning, ModelArtsDeleting, ModelArtsRestarting, ModelArtsTrainJobInit,
  2028. ModelArtsTrainJobImageCreating, ModelArtsTrainJobSubmitTrying, ModelArtsTrainJobWaiting, ModelArtsTrainJobRunning, ModelArtsStopping, ModelArtsResizing,
  2029. ModelArtsTrainJobScaling, ModelArtsTrainJobCheckInit, ModelArtsTrainJobCheckRunning, ModelArtsTrainJobKilling, ModelArtsTrainJobCheckRunningCompleted).And("repo_id = ?", repoID).Count(new(Cloudbrain))
  2030. return int(count), err
  2031. }
  2032. func GetModelSafetyCountByUserID(userID int64) (int, error) {
  2033. count, err := x.In("status", JobWaiting, JobRunning, ModelArtsTrainJobInit, ModelArtsTrainJobImageCreating, ModelArtsTrainJobSubmitTrying, ModelArtsTrainJobScaling, ModelArtsTrainJobCheckInit, ModelArtsTrainJobCheckRunning, ModelArtsTrainJobCheckRunningCompleted).And("job_type = ? and user_id = ?", string(JobTypeModelSafety), userID).Count(new(Cloudbrain))
  2034. return int(count), err
  2035. }
  2036. func GetWaitingCloudbrainCount(cloudbrainType int, computeResource string, jobTypes ...JobType) (int64, error) {
  2037. sess := x.Where("status=? and type=?", JobWaiting, cloudbrainType)
  2038. if len(jobTypes) > 0 {
  2039. sess.In("job_type", jobTypes)
  2040. }
  2041. if computeResource != "" {
  2042. sess.And("compute_resource=?", computeResource)
  2043. }
  2044. return sess.Count(new(Cloudbrain))
  2045. }
  2046. func GetNotFinalStatusTaskCount(userID int64, notFinalStatus []string, jobTypes []JobType) (int, error) {
  2047. count, err := x.In("status", notFinalStatus).
  2048. In("job_type", jobTypes).
  2049. And("user_id = ? ", userID).Count(new(Cloudbrain))
  2050. return int(count), err
  2051. }
  2052. func RestartCloudbrain(old *Cloudbrain, new *Cloudbrain) (err error) {
  2053. sess := x.NewSession()
  2054. defer sess.Close()
  2055. if err = sess.Begin(); err != nil {
  2056. return err
  2057. }
  2058. if _, err = sess.Delete(old); err != nil {
  2059. sess.Rollback()
  2060. return err
  2061. }
  2062. if _, err = sess.NoAutoTime().InsertOne(new); err != nil {
  2063. sess.Rollback()
  2064. return err
  2065. }
  2066. if new.Spec != nil {
  2067. if _, err = sess.Insert(NewCloudBrainSpec(new.ID, *new.Spec)); err != nil {
  2068. sess.Rollback()
  2069. return err
  2070. }
  2071. }
  2072. if err = sess.Commit(); err != nil {
  2073. return err
  2074. }
  2075. go IncreaseDatasetUseCount(new.Uuid)
  2076. return nil
  2077. }
  2078. func CloudbrainAll(opts *CloudbrainsOptions) ([]*CloudbrainInfo, int64, error) {
  2079. sess := x.NewSession()
  2080. defer sess.Close()
  2081. var cond = builder.NewCond()
  2082. if opts.RepoID > 0 {
  2083. cond = cond.And(
  2084. builder.Eq{"cloudbrain.repo_id": opts.RepoID},
  2085. )
  2086. }
  2087. if opts.UserID > 0 {
  2088. cond = cond.And(
  2089. builder.Eq{"cloudbrain.user_id": opts.UserID},
  2090. )
  2091. }
  2092. if (opts.JobID) != "" {
  2093. cond = cond.And(
  2094. builder.Eq{"cloudbrain.job_id": opts.JobID},
  2095. )
  2096. }
  2097. if (opts.ComputeResource) != "" {
  2098. cond = cond.And(
  2099. builder.Eq{"cloudbrain.compute_resource": opts.ComputeResource},
  2100. )
  2101. }
  2102. if (opts.Type) >= 0 {
  2103. cond = cond.And(
  2104. builder.Eq{"cloudbrain.type": opts.Type},
  2105. )
  2106. }
  2107. if len(opts.JobTypes) > 0 {
  2108. if opts.JobTypeNot {
  2109. cond = cond.And(
  2110. builder.NotIn("cloudbrain.job_type", opts.JobTypes),
  2111. )
  2112. } else {
  2113. cond = cond.And(
  2114. builder.In("cloudbrain.job_type", opts.JobTypes),
  2115. )
  2116. }
  2117. }
  2118. if (opts.AiCenter) != "" {
  2119. cond = cond.And(
  2120. builder.Like{"cloudbrain.ai_center", opts.AiCenter},
  2121. )
  2122. }
  2123. if (opts.NeedDeleteInfo) != "" {
  2124. if opts.NeedDeleteInfo == "yes" {
  2125. cond = cond.And(
  2126. builder.And(builder.NotNull{"cloudbrain.deleted_at"}),
  2127. )
  2128. }
  2129. if opts.NeedDeleteInfo == "no" {
  2130. cond = cond.And(
  2131. builder.And(builder.IsNull{"cloudbrain.deleted_at"}),
  2132. )
  2133. }
  2134. }
  2135. if (opts.IsLatestVersion) != "" {
  2136. cond = cond.And(builder.Or(builder.And(builder.Eq{"cloudbrain.is_latest_version": opts.IsLatestVersion},
  2137. builder.Eq{"cloudbrain.job_type": "TRAIN"}), builder.Neq{"cloudbrain.job_type": "TRAIN"}))
  2138. }
  2139. if len(opts.CloudbrainIDs) > 0 {
  2140. cond = cond.And(builder.In("cloudbrain.id", opts.CloudbrainIDs))
  2141. }
  2142. if len(opts.JobStatus) > 0 {
  2143. if opts.JobStatusNot {
  2144. cond = cond.And(
  2145. builder.NotIn("cloudbrain.status", opts.JobStatus),
  2146. )
  2147. } else {
  2148. cond = cond.And(
  2149. builder.In("cloudbrain.status", opts.JobStatus),
  2150. )
  2151. }
  2152. }
  2153. if len(opts.RepoIDList) > 0 {
  2154. cond = cond.And(
  2155. builder.In("cloudbrain.repo_id", opts.RepoIDList),
  2156. )
  2157. }
  2158. if opts.BeginTimeUnix > 0 && opts.EndTimeUnix > 0 {
  2159. cond = cond.And(
  2160. builder.And(builder.Gte{"cloudbrain.created_unix": opts.BeginTimeUnix}, builder.Lte{"cloudbrain.created_unix": opts.EndTimeUnix}),
  2161. )
  2162. }
  2163. if opts.WorkServerNumber > 0 {
  2164. if opts.WorkServerNumber == 1 {
  2165. cond = cond.And(builder.Or(
  2166. builder.Eq{"cloudbrain.work_server_number": 0},
  2167. builder.Eq{"cloudbrain.work_server_number": 1},
  2168. builder.IsNull{"cloudbrain.work_server_number"},
  2169. ))
  2170. } else {
  2171. cond = cond.And(
  2172. builder.Eq{"cloudbrain.work_server_number": opts.WorkServerNumber},
  2173. )
  2174. }
  2175. }
  2176. if opts.AccCardType != "" {
  2177. cond = cond.And(builder.Eq{"cloudbrain_spec.acc_card_type": opts.AccCardType})
  2178. }
  2179. if opts.AccCardsNum >= 0 {
  2180. cond = cond.And(builder.Eq{"cloudbrain_spec.acc_cards_num": opts.AccCardsNum})
  2181. }
  2182. var count int64
  2183. var err error
  2184. condition := "cloudbrain.user_id = `user`.id"
  2185. if len(opts.Keyword) == 0 {
  2186. count, err = sess.Table(&Cloudbrain{}).Unscoped().Where(cond).
  2187. Join("left", "`user`", condition).
  2188. Join("left", "cloudbrain_spec", "cloudbrain.id = cloudbrain_spec.cloudbrain_id").
  2189. Count(new(CloudbrainInfo))
  2190. } else {
  2191. lowerKeyWord := strings.ToLower(opts.Keyword)
  2192. cond = cond.And(builder.Or(builder.Like{"LOWER(cloudbrain.job_name)", lowerKeyWord},
  2193. builder.Like{"LOWER(cloudbrain.display_job_name)", lowerKeyWord}, builder.Like{"`user`.lower_name", lowerKeyWord}))
  2194. count, err = sess.Table(&Cloudbrain{}).Unscoped().Where(cond).
  2195. Join("left", "`user`", condition).
  2196. Join("left", "cloudbrain_spec", "cloudbrain.id = cloudbrain_spec.cloudbrain_id").
  2197. Count(new(CloudbrainInfo))
  2198. }
  2199. if err != nil {
  2200. return nil, 0, fmt.Errorf("Count: %v", err)
  2201. }
  2202. if opts.Page >= 0 && opts.PageSize > 0 {
  2203. var start int
  2204. if opts.Page == 0 {
  2205. start = 0
  2206. } else {
  2207. start = (opts.Page - 1) * opts.PageSize
  2208. }
  2209. sess.Limit(opts.PageSize, start)
  2210. }
  2211. sess.OrderBy("cloudbrain.created_unix DESC")
  2212. cloudbrains := make([]*CloudbrainInfo, 0, setting.UI.IssuePagingNum)
  2213. if err := sess.Table(&Cloudbrain{}).Unscoped().Where(cond).
  2214. Join("left", "`user`", condition).
  2215. Join("left", "cloudbrain_spec", "cloudbrain.id = cloudbrain_spec.cloudbrain_id").
  2216. Find(&cloudbrains); err != nil {
  2217. return nil, 0, fmt.Errorf("Find: %v", err)
  2218. }
  2219. if opts.NeedRepoInfo {
  2220. var ids []int64
  2221. for _, task := range cloudbrains {
  2222. ids = append(ids, task.RepoID)
  2223. }
  2224. repositoryMap, err := GetRepositoriesMapByIDs(ids)
  2225. if err == nil {
  2226. for _, task := range cloudbrains {
  2227. task.Repo = repositoryMap[task.RepoID]
  2228. }
  2229. }
  2230. }
  2231. return cloudbrains, count, nil
  2232. }
  2233. func CloudbrainAllStatic(opts *CloudbrainsOptions) ([]*CloudbrainInfo, int64, error) {
  2234. sess := x.NewSession()
  2235. defer sess.Close()
  2236. var cond = builder.NewCond()
  2237. if (opts.Type) >= 0 {
  2238. cond = cond.And(
  2239. builder.Eq{"cloudbrain.type": opts.Type},
  2240. )
  2241. }
  2242. if opts.BeginTimeUnix > 0 && opts.EndTimeUnix > 0 {
  2243. cond = cond.And(
  2244. builder.And(builder.Gte{"cloudbrain.created_unix": opts.BeginTimeUnix}, builder.Lte{"cloudbrain.created_unix": opts.EndTimeUnix}),
  2245. )
  2246. }
  2247. if opts.DateBeginTimeUnix > 0 {
  2248. cond = cond.And(builder.Or(
  2249. builder.Gte{"cloudbrain.end_time": opts.DateBeginTimeUnix},
  2250. builder.IsNull{"cloudbrain.end_time"},
  2251. ))
  2252. }
  2253. var count int64
  2254. var err error
  2255. count, err = sess.Unscoped().Where(cond).Count(new(Cloudbrain))
  2256. if err != nil {
  2257. return nil, 0, fmt.Errorf("Count: %v", err)
  2258. }
  2259. if opts.Page >= 0 && opts.PageSize > 0 {
  2260. var start int
  2261. if opts.Page == 0 {
  2262. start = 0
  2263. } else {
  2264. start = (opts.Page - 1) * opts.PageSize
  2265. }
  2266. sess.Limit(opts.PageSize, start)
  2267. }
  2268. // sess.OrderBy("cloudbrain.created_unix DESC")
  2269. cloudbrains := make([]*CloudbrainInfo, 0, setting.UI.IssuePagingNum)
  2270. if err := sess.Table(&Cloudbrain{}).Unscoped().Where(cond).
  2271. Find(&cloudbrains); err != nil {
  2272. return nil, 0, fmt.Errorf("Find: %v", err)
  2273. }
  2274. if opts.NeedRepoInfo {
  2275. var ids []int64
  2276. for _, task := range cloudbrains {
  2277. ids = append(ids, task.RepoID)
  2278. }
  2279. repositoryMap, err := GetRepositoriesMapByIDs(ids)
  2280. if err == nil {
  2281. for _, task := range cloudbrains {
  2282. task.Repo = repositoryMap[task.RepoID]
  2283. }
  2284. }
  2285. }
  2286. return cloudbrains, count, nil
  2287. }
  2288. func CloudbrainAllKanBan(opts *CloudbrainsOptions) ([]*CloudbrainInfo, int64, error) {
  2289. sess := x.NewSession()
  2290. defer sess.Close()
  2291. var cond = builder.NewCond()
  2292. if (opts.Type) >= 0 {
  2293. cond = cond.And(
  2294. builder.Eq{"cloudbrain.type": opts.Type},
  2295. )
  2296. }
  2297. if opts.BeginTimeUnix > 0 && opts.EndTimeUnix > 0 {
  2298. cond = cond.And(
  2299. builder.And(builder.Gte{"cloudbrain.created_unix": opts.BeginTimeUnix}, builder.Lte{"cloudbrain.created_unix": opts.EndTimeUnix}),
  2300. )
  2301. }
  2302. var count int64
  2303. var err error
  2304. count, err = sess.Unscoped().Where(cond).Count(new(Cloudbrain))
  2305. if err != nil {
  2306. return nil, 0, fmt.Errorf("Count: %v", err)
  2307. }
  2308. if opts.Page >= 0 && opts.PageSize > 0 {
  2309. var start int
  2310. if opts.Page == 0 {
  2311. start = 0
  2312. } else {
  2313. start = (opts.Page - 1) * opts.PageSize
  2314. }
  2315. sess.Limit(opts.PageSize, start)
  2316. }
  2317. // sess.OrderBy("cloudbrain.created_unix DESC")
  2318. cloudbrains := make([]*CloudbrainInfo, 0, setting.UI.IssuePagingNum)
  2319. if err := sess.Cols("id", "type", "work_server_number", "duration", "train_job_duration", "ai_center", "cluster").Table(&Cloudbrain{}).Unscoped().Where(cond).
  2320. Find(&cloudbrains); err != nil {
  2321. return nil, 0, fmt.Errorf("Find: %v", err)
  2322. }
  2323. if opts.NeedRepoInfo {
  2324. var ids []int64
  2325. for _, task := range cloudbrains {
  2326. ids = append(ids, task.RepoID)
  2327. }
  2328. repositoryMap, err := GetRepositoriesMapByIDs(ids)
  2329. if err == nil {
  2330. for _, task := range cloudbrains {
  2331. task.Repo = repositoryMap[task.RepoID]
  2332. }
  2333. }
  2334. }
  2335. return cloudbrains, count, nil
  2336. }
  2337. func GetStartedCloudbrainTaskByUpdatedUnix(startTime, endTime time.Time) ([]Cloudbrain, error) {
  2338. r := make([]Cloudbrain, 0)
  2339. err := x.Where("updated_unix >= ? and updated_unix <= ? and start_time > 0", startTime.Unix(), endTime.Unix()).Unscoped().Find(&r)
  2340. if err != nil {
  2341. return nil, err
  2342. }
  2343. return r, nil
  2344. }
  2345. func GetCloudbrainByIds(ids []int64) ([]*Cloudbrain, error) {
  2346. if len(ids) == 0 {
  2347. return nil, nil
  2348. }
  2349. cloudbrains := make([]*Cloudbrain, 0)
  2350. err := x.In("id", ids).Unscoped().Find(&cloudbrains)
  2351. if err != nil {
  2352. return nil, err
  2353. }
  2354. return cloudbrains, nil
  2355. }
  2356. type DatasetInfo struct {
  2357. DataLocalPath string
  2358. Name string
  2359. FullName string
  2360. Type int
  2361. Size int64
  2362. }
  2363. func GetDatasetInfo(uuidStr string, grampusType ...string) (map[string]DatasetInfo, string, error) {
  2364. var datasetNames string
  2365. uuids := strings.Split(uuidStr, ";")
  2366. if len(uuids) > setting.MaxDatasetNum {
  2367. log.Error("the dataset count(%d) exceed the limit", len(uuids))
  2368. return nil, datasetNames, errors.New("the dataset count exceed the limit")
  2369. }
  2370. datasetInfos := make(map[string]DatasetInfo)
  2371. attachs, err := GetAttachmentsByUUIDs(uuids)
  2372. if err != nil {
  2373. log.Error("GetAttachmentsByUUIDs failed: %v", err)
  2374. return nil, datasetNames, err
  2375. }
  2376. for i, tmpUuid := range uuids {
  2377. var attach *Attachment
  2378. for _, tmpAttach := range attachs {
  2379. if tmpAttach.UUID == tmpUuid {
  2380. attach = tmpAttach
  2381. break
  2382. }
  2383. }
  2384. if attach == nil {
  2385. log.Error("GetAttachmentsByUUIDs failed: %v", err)
  2386. return nil, datasetNames, err
  2387. }
  2388. fileName := strings.TrimSuffix(strings.TrimSuffix(strings.TrimSuffix(attach.Name, ".zip"), ".tar.gz"), ".tgz")
  2389. for _, datasetInfo := range datasetInfos {
  2390. if fileName == datasetInfo.Name {
  2391. log.Error("the dataset name is same: %v", attach.Name)
  2392. return nil, datasetNames, errors.New("the dataset name is same")
  2393. }
  2394. }
  2395. var dataLocalPath string
  2396. if len(grampusType) > 0 {
  2397. if grampusType[0] == GPU {
  2398. dataLocalPath = setting.Attachment.Minio.BasePath + path.Join(attach.UUID[0:1], attach.UUID[1:2]) + "/" + attach.UUID
  2399. } else if grampusType[0] == NPU {
  2400. dataLocalPath = setting.BasePath + path.Join(attach.UUID[0:1], attach.UUID[1:2]) + "/" + attach.UUID + "/"
  2401. } else if grampusType[0] == GCU {
  2402. if attach.Type == TypeCloudBrainOne {
  2403. dataLocalPath = setting.Attachment.Minio.BasePath + path.Join(attach.UUID[0:1], attach.UUID[1:2]) + "/" + attach.UUID
  2404. } else {
  2405. dataLocalPath = setting.BasePath + path.Join(attach.UUID[0:1], attach.UUID[1:2]) + "/" + attach.UUID + "/"
  2406. }
  2407. }
  2408. } else {
  2409. dataLocalPath = setting.Attachment.Minio.RealPath +
  2410. setting.Attachment.Minio.Bucket + "/" +
  2411. setting.Attachment.Minio.BasePath +
  2412. AttachmentRelativePath(attach.UUID) +
  2413. attach.UUID
  2414. }
  2415. datasetInfos[attach.UUID] = DatasetInfo{
  2416. DataLocalPath: dataLocalPath,
  2417. Name: fileName,
  2418. FullName: attach.Name,
  2419. Type: attach.Type,
  2420. Size: attach.Size,
  2421. }
  2422. if i == 0 {
  2423. datasetNames = attach.Name
  2424. } else {
  2425. datasetNames += ";" + attach.Name
  2426. }
  2427. }
  2428. return datasetInfos, datasetNames, nil
  2429. }
  2430. var (
  2431. SpecsMapInitFlag = false
  2432. CloudbrainDebugResourceSpecsMap map[int]*ResourceSpec
  2433. CloudbrainTrainResourceSpecsMap map[int]*ResourceSpec
  2434. CloudbrainInferenceResourceSpecsMap map[int]*ResourceSpec
  2435. CloudbrainBenchmarkResourceSpecsMap map[int]*ResourceSpec
  2436. CloudbrainSpecialResourceSpecsMap map[int]*ResourceSpec
  2437. GpuInfosMapInitFlag = false
  2438. CloudbrainDebugGpuInfosMap map[string]*GpuInfo
  2439. CloudbrainTrainGpuInfosMap map[string]*GpuInfo
  2440. CloudbrainInferenceGpuInfosMap map[string]*GpuInfo
  2441. CloudbrainBenchmarkGpuInfosMap map[string]*GpuInfo
  2442. CloudbrainSpecialGpuInfosMap map[string]*GpuInfo
  2443. )
  2444. func GetNewestJobsByAiCenter() ([]int64, error) {
  2445. ids := make([]int64, 0)
  2446. return ids, x.
  2447. Select("max(id) as id").
  2448. Where("type=? and ai_center!='' and ai_center is not null", TypeC2Net).
  2449. GroupBy("ai_center").
  2450. Table(Cloudbrain{}).
  2451. Find(&ids)
  2452. }
  2453. func GetNewestJobsByType() ([]int64, error) {
  2454. ids := make([]int64, 0)
  2455. return ids, x.
  2456. Select("max(id) as id").
  2457. In("type", TypeCloudBrainOne, TypeCloudBrainTwo).
  2458. GroupBy("type").
  2459. Table(Cloudbrain{}).
  2460. Find(&ids)
  2461. }
  2462. func GetCloudbrainByIDs(ids []int64) ([]*Cloudbrain, error) {
  2463. cloudbrains := make([]*Cloudbrain, 0)
  2464. return cloudbrains, x.
  2465. In("id", ids).
  2466. Find(&cloudbrains)
  2467. }
  2468. func GetCloudbrainWithDeletedByIDs(ids []int64) ([]*Cloudbrain, error) {
  2469. cloudbrains := make([]*Cloudbrain, 0)
  2470. return cloudbrains, x.
  2471. In("id", ids).Unscoped().Find(&cloudbrains)
  2472. }
  2473. func GetCloudbrainCountByJobName(jobName, jobType string, typeCloudbrain int) (int, error) {
  2474. count, err := x.Where("job_name = ? and job_type= ? and type = ?", jobName, jobType, typeCloudbrain).Count(new(Cloudbrain))
  2475. return int(count), err
  2476. }
  2477. func LoadSpecs(tasks []*Cloudbrain) error {
  2478. cloudbrainIds := make([]int64, len(tasks))
  2479. for i, v := range tasks {
  2480. cloudbrainIds[i] = v.ID
  2481. }
  2482. specs := make([]*CloudbrainSpec, 0)
  2483. err := x.In("cloudbrain_id", cloudbrainIds).Find(&specs)
  2484. if err != nil {
  2485. return err
  2486. }
  2487. specMap := make(map[int64]*CloudbrainSpec)
  2488. for _, v := range specs {
  2489. specMap[v.SpecId] = v
  2490. }
  2491. for _, v := range tasks {
  2492. if specMap[v.ID] != nil {
  2493. v.Spec = specMap[v.ID].ConvertToSpecification()
  2494. }
  2495. }
  2496. return nil
  2497. }
  2498. func LoadSpecs4CloudbrainInfo(tasks []*CloudbrainInfo) error {
  2499. cloudbrainIds := make([]int64, len(tasks))
  2500. for i, v := range tasks {
  2501. cloudbrainIds[i] = v.Cloudbrain.ID
  2502. }
  2503. specs := make([]*CloudbrainSpec, 0)
  2504. err := x.In("cloudbrain_id", cloudbrainIds).Find(&specs)
  2505. if err != nil {
  2506. return err
  2507. }
  2508. specMap := make(map[int64]*CloudbrainSpec)
  2509. for _, v := range specs {
  2510. specMap[v.CloudbrainID] = v
  2511. }
  2512. for _, v := range tasks {
  2513. if specMap[v.Cloudbrain.ID] != nil {
  2514. v.Cloudbrain.Spec = specMap[v.Cloudbrain.ID].ConvertToSpecification()
  2515. }
  2516. }
  2517. return nil
  2518. }