@@ -46,7 +46,8 @@ type CloudbrainDurationStatistic struct { | |||
ComputeResource string | |||
AccCardType string `xorm:"INDEX"` | |||
DateTime timeutil.TimeStamp `xorm:"INDEX"` | |||
DateTime timeutil.TimeStamp `xorm:"INDEX DEFAULT 0"` | |||
DateTimeUnix timeutil.TimeStamp `xorm:"INDEX DEFAULT 0"` | |||
DayTime string `xorm:"INDEX"` | |||
HourTime int `xorm:"INDEX"` | |||
CardsUseDuration int | |||
@@ -274,7 +275,6 @@ func GetCloudbrainByTime(beginTime int64, endTime int64) ([]*CloudbrainInfo, err | |||
sess := x.NewSession() | |||
defer sess.Close() | |||
var cond = builder.NewCond() | |||
sess.Exec("if ") | |||
cond = cond.Or( | |||
builder.And(builder.Gte{"cloudbrain.end_time": beginTime}, builder.Lte{"cloudbrain.start_time": beginTime}, builder.Gt{"cloudbrain.start_time": 0}), | |||
) | |||
@@ -284,11 +284,12 @@ func GetCloudbrainByTime(beginTime int64, endTime int64) ([]*CloudbrainInfo, err | |||
cond = cond.Or( | |||
builder.And(builder.Eq{"cloudbrain.status": string(JobRunning)}), | |||
) | |||
sess.OrderBy("cloudbrain.created_unix ASC") | |||
sess.OrderBy("cloudbrain.id ASC") | |||
cloudbrains := make([]*CloudbrainInfo, 0, 10) | |||
if err := sess.Table(&Cloudbrain{}).Unscoped().Where(cond). | |||
Find(&cloudbrains); err != nil { | |||
log.Info("find error.") | |||
log.Error("find error.") | |||
return nil, err | |||
} | |||
return cloudbrains, nil | |||
} | |||
@@ -303,7 +304,8 @@ func GetSpecByAiCenterCodeAndType(aiCenterCode string, accCardType string) ([]*C | |||
cloudbrainSpecs := make([]*CloudbrainSpec, 0, 10) | |||
if err := sess.Table(&CloudbrainSpec{}).Where(cond). | |||
Find(&cloudbrainSpecs); err != nil { | |||
log.Info("find error.") | |||
log.Error("find error.") | |||
return nil, err | |||
} | |||
return cloudbrainSpecs, nil | |||
} | |||
@@ -328,7 +330,8 @@ func GetCanUseCardInfo() ([]*ResourceQueue, error) { | |||
sess.OrderBy("resource_queue.cluster DESC, resource_queue.ai_center_code ASC") | |||
ResourceQueues := make([]*ResourceQueue, 0, 10) | |||
if err := sess.Table(&ResourceQueue{}).Find(&ResourceQueues); err != nil { | |||
log.Info("find error.") | |||
log.Error("find error.") | |||
return nil, err | |||
} | |||
return ResourceQueues, nil | |||
} | |||
@@ -339,7 +342,7 @@ func GetCardDurationStatistics(opts *DurationStatisticOptions) ([]*CloudbrainDur | |||
var cond = builder.NewCond() | |||
if opts.BeginTime.Unix() > 0 && opts.EndTime.Unix() > 0 { | |||
cond = cond.And( | |||
builder.And(builder.Gte{"cloudbrain_duration_statistic.date_time": opts.BeginTime.Unix()}, builder.Lt{"cloudbrain_duration_statistic.date_time": opts.EndTime.Unix()}), | |||
builder.And(builder.Gte{"cloudbrain_duration_statistic.date_time_unix": opts.BeginTime.Unix()}, builder.Lt{"cloudbrain_duration_statistic.date_time_unix": opts.EndTime.Unix()}), | |||
) | |||
} | |||
if opts.AiCenterCode != "" { | |||
@@ -350,7 +353,8 @@ func GetCardDurationStatistics(opts *DurationStatisticOptions) ([]*CloudbrainDur | |||
CloudbrainDurationStatistics := make([]*CloudbrainDurationStatistic, 0, 10) | |||
if err := sess.Table(&CloudbrainDurationStatistic{}).Where(cond). | |||
Find(&CloudbrainDurationStatistics); err != nil { | |||
log.Info("find error.") | |||
log.Error("find error.") | |||
return nil, err | |||
} | |||
return CloudbrainDurationStatistics, nil | |||
} | |||
@@ -358,10 +362,18 @@ func GetCardDurationStatistics(opts *DurationStatisticOptions) ([]*CloudbrainDur | |||
func GetDurationRecordBeginTime() ([]*CloudbrainDurationStatistic, error) { | |||
sess := xStatistic.NewSession() | |||
defer sess.Close() | |||
sess.OrderBy("cloudbrain_duration_statistic.date_time ASC limit 1") | |||
var cond = builder.NewCond() | |||
cond = cond.And( | |||
builder.Gt{"cloudbrain_duration_statistic.date_time_unix": 0}, | |||
) | |||
sess.OrderBy("cloudbrain_duration_statistic.date_time_unix ASC limit 1") | |||
CloudbrainDurationStatistics := make([]*CloudbrainDurationStatistic, 0) | |||
if err := sess.Table(&CloudbrainDurationStatistic{}).Find(&CloudbrainDurationStatistics); err != nil { | |||
log.Info("find error.") | |||
if err := sess.Table(&CloudbrainDurationStatistic{}).Where(cond).Find(&CloudbrainDurationStatistics); err != nil { | |||
log.Error("find error.") | |||
return nil, err | |||
} | |||
return CloudbrainDurationStatistics, nil | |||
} | |||
@@ -369,10 +381,16 @@ func GetDurationRecordBeginTime() ([]*CloudbrainDurationStatistic, error) { | |||
func GetDurationRecordUpdateTime() ([]*CloudbrainDurationStatistic, error) { | |||
sess := xStatistic.NewSession() | |||
defer sess.Close() | |||
sess.OrderBy("cloudbrain_duration_statistic.date_time DESC limit 1") | |||
var cond = builder.NewCond() | |||
cond = cond.And( | |||
builder.Gt{"cloudbrain_duration_statistic.date_time_unix": 1577808000}, | |||
) | |||
sess.OrderBy("cloudbrain_duration_statistic.date_time_unix DESC limit 1") | |||
CloudbrainDurationStatistics := make([]*CloudbrainDurationStatistic, 0) | |||
if err := sess.Table(&CloudbrainDurationStatistic{}).Find(&CloudbrainDurationStatistics); err != nil { | |||
log.Info("find error.") | |||
if err := sess.Table(&CloudbrainDurationStatistic{}).Where(cond).Find(&CloudbrainDurationStatistics); err != nil { | |||
log.Error("find error.") | |||
return nil, err | |||
} | |||
return CloudbrainDurationStatistics, nil | |||
} | |||
@@ -380,8 +398,8 @@ func GetDurationRecordUpdateTime() ([]*CloudbrainDurationStatistic, error) { | |||
func DeleteCloudbrainDurationStatistic(beginTime timeutil.TimeStamp, endTime timeutil.TimeStamp) error { | |||
sess := xStatistic.NewSession() | |||
defer sess.Close() | |||
if _, err := sess.Exec("DELETE FROM cloudbrain_duration_statistic WHERE cloudbrain_duration_statistic.date_time BETWEEN ? AND ?", beginTime, endTime); err != nil { | |||
log.Info("DELETE cloudbrain_duration_statistic data error.") | |||
if _, err := sess.Exec("DELETE FROM cloudbrain_duration_statistic WHERE cloudbrain_duration_statistic.date_time_unix BETWEEN ? AND ?", beginTime, endTime); err != nil { | |||
log.Error("DELETE cloudbrain_duration_statistic data error.") | |||
return err | |||
} | |||
return nil | |||
@@ -584,6 +584,8 @@ var ( | |||
TrainJobFLAVORINFOS string | |||
ModelArtsSpecialPools string | |||
ModelArtsMultiNode string | |||
//kanban | |||
IsCloudbrainTimingEnabled bool | |||
// modelarts-cd config | |||
ModelartsCD = struct { | |||
@@ -1609,6 +1611,9 @@ func NewContext() { | |||
FileNoteBook.ImageNPUDescription = sec.Key("image_npu_desc").MustString("") | |||
FileNoteBook.ImageNPUCDDescription = sec.Key("image_npu_cd_desc").MustString("") | |||
sec = Cfg.Section("kanban") | |||
IsCloudbrainTimingEnabled = sec.Key("ENABLED").MustBool(false) | |||
getGrampusConfig() | |||
getModelartsCDConfig() | |||
getModelConvertConfig() | |||
@@ -11,6 +11,7 @@ import ( | |||
"code.gitea.io/gitea/models" | |||
"code.gitea.io/gitea/modules/context" | |||
"code.gitea.io/gitea/modules/log" | |||
"code.gitea.io/gitea/modules/timeutil" | |||
"code.gitea.io/gitea/routers/repo" | |||
cloudbrainService "code.gitea.io/gitea/services/cloudbrain" | |||
"code.gitea.io/gitea/services/cloudbrain/resource" | |||
@@ -1464,12 +1465,17 @@ func getCloudbrainTimePeroid(ctx *context.Context, recordBeginTime time.Time) (t | |||
} | |||
func GetCloudbrainResourceOverview(ctx *context.Context) { | |||
var recordBeginTime timeutil.TimeStamp | |||
recordCloudbrainDuration, err := models.GetDurationRecordBeginTime() | |||
if err != nil { | |||
log.Error("Can not get GetDurationRecordBeginTime", err) | |||
return | |||
} | |||
recordBeginTime := recordCloudbrainDuration[0].DateTime | |||
if len(recordCloudbrainDuration) > 0 && err == nil { | |||
recordBeginTime = recordCloudbrainDuration[0].DateTimeUnix | |||
} else { | |||
recordBeginTime = timeutil.TimeStamp(time.Now().Unix()) | |||
} | |||
recordUpdateTime := time.Now().Unix() | |||
resourceQueues, err := models.GetCanUseCardInfo() | |||
if err != nil { | |||
@@ -1596,6 +1602,7 @@ func getBeginAndEndTime(ctx *context.Context) (time.Time, time.Time) { | |||
now := time.Now() | |||
beginTimeStr := ctx.QueryTrim("beginTime") | |||
endTimeStr := ctx.QueryTrim("endTime") | |||
var brainRecordBeginTime time.Time | |||
var beginTime time.Time | |||
var endTime time.Time | |||
@@ -1608,7 +1615,12 @@ func getBeginAndEndTime(ctx *context.Context) (time.Time, time.Time) { | |||
ctx.Error(http.StatusBadRequest, ctx.Tr("repo.record_begintime_get_err")) | |||
return beginTime, endTime | |||
} | |||
brainRecordBeginTime := recordCloudbrainDuration[0].DateTime.AsTime() | |||
if len(recordCloudbrainDuration) > 0 && err == nil { | |||
brainRecordBeginTime = recordCloudbrainDuration[0].DateTimeUnix.AsTime() | |||
} else { | |||
brainRecordBeginTime = now | |||
} | |||
beginTime = brainRecordBeginTime | |||
endTime = now | |||
} else if queryType == "today" { | |||
@@ -1650,7 +1662,11 @@ func getBeginAndEndTime(ctx *context.Context) (time.Time, time.Time) { | |||
ctx.Error(http.StatusBadRequest, ctx.Tr("repo.record_begintime_get_err")) | |||
return beginTime, endTime | |||
} | |||
brainRecordBeginTime := recordCloudbrainDuration[0].DateTime.AsTime() | |||
if len(recordCloudbrainDuration) > 0 && err == nil { | |||
brainRecordBeginTime = recordCloudbrainDuration[0].DateTimeUnix.AsTime() | |||
} else { | |||
brainRecordBeginTime = now | |||
} | |||
beginTime = brainRecordBeginTime | |||
endTime = now | |||
} else { | |||
@@ -1681,7 +1697,7 @@ func getAiCenterUsageDuration(beginTime time.Time, endTime time.Time, cloudbrain | |||
usageRate := float64(0) | |||
for _, cloudbrainStatistic := range cloudbrainStatistics { | |||
if int64(cloudbrainStatistic.DateTime) >= beginTime.Unix() && int64(cloudbrainStatistic.DateTime) < endTime.Unix() { | |||
if int64(cloudbrainStatistic.DateTimeUnix) >= beginTime.Unix() && int64(cloudbrainStatistic.DateTimeUnix) < endTime.Unix() { | |||
totalDuration += cloudbrainStatistic.CardsTotalDuration | |||
usageDuration += cloudbrainStatistic.CardsUseDuration | |||
} | |||
@@ -1,6 +1,7 @@ | |||
package repo | |||
import ( | |||
"fmt" | |||
"net/http" | |||
"strings" | |||
"time" | |||
@@ -8,11 +9,13 @@ import ( | |||
"code.gitea.io/gitea/models" | |||
"code.gitea.io/gitea/modules/context" | |||
"code.gitea.io/gitea/modules/log" | |||
"code.gitea.io/gitea/modules/setting" | |||
"code.gitea.io/gitea/modules/timeutil" | |||
cloudbrainService "code.gitea.io/gitea/services/cloudbrain" | |||
) | |||
func CloudbrainDurationStatisticHour() { | |||
if setting.IsCloudbrainTimingEnabled { | |||
var statisticTime time.Time | |||
var count int64 | |||
recordDurationUpdateTime, err := models.GetDurationRecordUpdateTime() | |||
@@ -22,7 +25,7 @@ func CloudbrainDurationStatisticHour() { | |||
now := time.Now() | |||
currentTime := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), 0, 0, 0, now.Location()) | |||
if err == nil && len(recordDurationUpdateTime) > 0 { | |||
statisticTime = time.Unix(int64(recordDurationUpdateTime[0].DateTime), 0).Add(+1 * time.Hour) | |||
statisticTime = time.Unix(int64(recordDurationUpdateTime[0].DateTimeUnix), 0).Add(+1 * time.Hour) | |||
} else { | |||
statisticTime = currentTime | |||
} | |||
@@ -39,6 +42,7 @@ func CloudbrainDurationStatisticHour() { | |||
} | |||
log.Info("summaryDurationStat count: %v", count) | |||
} | |||
} | |||
func UpdateDurationStatisticHistoryData(beginTime time.Time, endTime time.Time) int64 { | |||
var count int64 | |||
statisticTime := beginTime | |||
@@ -54,7 +58,7 @@ func UpdateDurationStatisticHistoryData(beginTime time.Time, endTime time.Time) | |||
//statisticTime是当前的时辰,比如当前是2019-01-01 12:01:01,那么statisticTime就是2019-01-01 12:00:00 | |||
func summaryDurationStat(statisticTime time.Time) int64 { | |||
var count int64 | |||
dateTime := timeutil.TimeStamp(statisticTime.Add(-1 * time.Hour).Unix()) | |||
dateTimeUnix := timeutil.TimeStamp(statisticTime.Add(-1 * time.Hour).Unix()) | |||
beginTime := statisticTime.Add(-1 * time.Hour).Unix() | |||
dayTime := statisticTime.Add(-1 * time.Hour).Format("2006-01-02") | |||
hourTime := statisticTime.Add(-1 * time.Hour).Hour() | |||
@@ -65,27 +69,9 @@ func summaryDurationStat(statisticTime time.Time) int64 { | |||
log.Info("GetCloudbrainByTime err: %v", err) | |||
return 0 | |||
} | |||
cloudbrainMap := make(map[string]*models.Cloudbrain) | |||
fmt.Printf("ciTasks:", ciTasks[0].Cloudbrain.JobName) | |||
models.LoadSpecs4CloudbrainInfo(ciTasks) | |||
for _, cloudbrain := range ciTasks { | |||
if cloudbrain.Cloudbrain.StartTime == 0 { | |||
cloudbrain.Cloudbrain.StartTime = cloudbrain.Cloudbrain.CreatedUnix | |||
} | |||
if cloudbrain.Cloudbrain.EndTime == 0 { | |||
cloudbrain.Cloudbrain.EndTime = cloudbrain.Cloudbrain.UpdatedUnix | |||
} | |||
cloudbrain = cloudbrainService.UpdateCloudbrainAiCenter(cloudbrain) | |||
if cloudbrain.Cloudbrain.Spec != nil { | |||
if _, ok := cloudbrainMap[cloudbrain.Cloudbrain.AiCenter+"/"+cloudbrain.Cloudbrain.Spec.AccCardType]; !ok { | |||
if cloudbrain.Cloudbrain.Spec != nil { | |||
cloudbrainMap[cloudbrain.Cloudbrain.AiCenter+"/"+cloudbrain.Cloudbrain.Spec.AccCardType] = &cloudbrain.Cloudbrain | |||
} | |||
} | |||
} | |||
} | |||
cloudBrainCenterCodeAndCardTypeInfo := getcloudBrainCenterCodeAndCardTypeInfo(ciTasks, beginTime, endTime) | |||
cloudBrainCenterCodeAndCardTypeInfo, cloudbrainMap := getcloudBrainCenterCodeAndCardTypeInfo(ciTasks, beginTime, endTime) | |||
resourceQueues, err := models.GetCanUseCardInfo() | |||
if err != nil { | |||
@@ -110,7 +96,7 @@ func summaryDurationStat(statisticTime time.Time) int64 { | |||
cardsTotalDurationMap[cloudbrainTable.Cluster+"/"+centerCode+"/"+cardType] = 0 | |||
} | |||
cloudbrainDurationStat := models.CloudbrainDurationStatistic{ | |||
DateTime: dateTime, | |||
DateTimeUnix: dateTimeUnix, | |||
DayTime: dayTime, | |||
HourTime: hourTime, | |||
Cluster: cloudbrainTable.Cluster, | |||
@@ -132,7 +118,7 @@ func summaryDurationStat(statisticTime time.Time) int64 { | |||
for key, cardsTotalDuration := range cardsTotalDurationMap { | |||
cloudbrainDurationStat := models.CloudbrainDurationStatistic{ | |||
DateTime: dateTime, | |||
DateTimeUnix: dateTimeUnix, | |||
DayTime: dayTime, | |||
HourTime: hourTime, | |||
Cluster: strings.Split(key, "/")[0], | |||
@@ -169,11 +155,27 @@ func GetAiCenterNameByCode(centerCode string, language string) string { | |||
return aiCenterName | |||
} | |||
func getcloudBrainCenterCodeAndCardTypeInfo(ciTasks []*models.CloudbrainInfo, beginTime int64, endTime int64) map[string]map[string]int { | |||
func getcloudBrainCenterCodeAndCardTypeInfo(ciTasks []*models.CloudbrainInfo, beginTime int64, endTime int64) (map[string]map[string]int, map[string]*models.Cloudbrain) { | |||
var WorkServerNumber int | |||
var AccCardsNum int | |||
cloudbrainMap := make(map[string]*models.Cloudbrain) | |||
cloudBrainCenterCodeAndCardType := make(map[string]map[string]int) | |||
for _, cloudbrain := range ciTasks { | |||
if cloudbrain.Cloudbrain.StartTime == 0 { | |||
cloudbrain.Cloudbrain.StartTime = cloudbrain.Cloudbrain.CreatedUnix | |||
} | |||
if cloudbrain.Cloudbrain.EndTime == 0 { | |||
cloudbrain.Cloudbrain.EndTime = timeutil.TimeStamp(time.Now().Unix()) | |||
} | |||
cloudbrain = cloudbrainService.UpdateCloudbrainAiCenter(cloudbrain) | |||
if cloudbrain.Cloudbrain.Spec != nil { | |||
if _, ok := cloudbrainMap[cloudbrain.Cloudbrain.AiCenter+"/"+cloudbrain.Cloudbrain.Spec.AccCardType]; !ok { | |||
if cloudbrain.Cloudbrain.Spec != nil { | |||
cloudbrainMap[cloudbrain.Cloudbrain.AiCenter+"/"+cloudbrain.Cloudbrain.Spec.AccCardType] = &cloudbrain.Cloudbrain | |||
} | |||
} | |||
} | |||
cloudbrain = cloudbrainService.UpdateCloudbrainAiCenter(cloudbrain) | |||
if cloudbrain.Cloudbrain.StartTime == 0 { | |||
cloudbrain.Cloudbrain.StartTime = cloudbrain.Cloudbrain.CreatedUnix | |||
@@ -195,7 +197,7 @@ func getcloudBrainCenterCodeAndCardTypeInfo(ciTasks []*models.CloudbrainInfo, be | |||
cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter] = make(map[string]int) | |||
} | |||
if cloudbrain.Cloudbrain.Spec != nil { | |||
if cloudbrain.Cloudbrain.Status == string(models.ModelArtsRunning) { | |||
if cloudbrain.Cloudbrain.Status == string(models.ModelArtsRunning) && cloudbrain.Cloudbrain.DeletedAt.IsZero() { | |||
if _, ok := cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType]; !ok { | |||
if int64(cloudbrain.Cloudbrain.StartTime) < beginTime { | |||
cloudBrainCenterCodeAndCardType[cloudbrain.Cloudbrain.AiCenter][cloudbrain.Cloudbrain.Spec.AccCardType] = AccCardsNum * WorkServerNumber * (int(endTime) - int(beginTime)) | |||
@@ -239,7 +241,7 @@ func getcloudBrainCenterCodeAndCardTypeInfo(ciTasks []*models.CloudbrainInfo, be | |||
} | |||
} | |||
return cloudBrainCenterCodeAndCardType | |||
return cloudBrainCenterCodeAndCardType, cloudbrainMap | |||
} | |||
func CloudbrainUpdateHistoryData(ctx *context.Context) { | |||
@@ -257,7 +259,7 @@ func CloudbrainUpdateHistoryData(ctx *context.Context) { | |||
endTimeUnix := timeutil.TimeStamp(endTime.Unix()) | |||
err = models.DeleteCloudbrainDurationStatistic(beginTimeUnix, endTimeUnix) | |||
count = UpdateDurationStatisticHistoryData(beginTime.Add(+1*time.Hour), endTime) | |||
count = UpdateDurationStatisticHistoryData(beginTime.Add(+1*time.Hour), endTime.Add(+1*time.Hour)) | |||
} | |||
ctx.JSON(http.StatusOK, map[string]interface{}{ | |||
"message": 0, | |||
Dear OpenI User
Thank you for your continuous support to the Openl Qizhi Community AI Collaboration Platform. In order to protect your usage rights and ensure network security, we updated the Openl Qizhi Community AI Collaboration Platform Usage Agreement in January 2024. The updated agreement specifies that users are prohibited from using intranet penetration tools. After you click "Agree and continue", you can continue to use our services. Thank you for your cooperation and understanding.
For more agreement content, please refer to the《Openl Qizhi Community AI Collaboration Platform Usage Agreement》