diff --git a/admin-portal/src/views/devManager/components/notebook/notebookProfile.vue b/admin-portal/src/views/devManager/components/notebook/notebookProfile.vue index b7a7daba..7123b8cc 100644 --- a/admin-portal/src/views/devManager/components/notebook/notebookProfile.vue +++ b/admin-portal/src/views/devManager/components/notebook/notebookProfile.vue @@ -63,6 +63,12 @@ {{ profileInfo.command }} + +
+ 自动停止: + {{profileInfo.autoStopDuration == -1 ? '任务不会自动停止' : profileInfo.autoStopDuration/3600 + '小时'}} +
+
diff --git a/deploy/upgrade.md b/deploy/upgrade.md index 7a960d5d..78b30499 100644 --- a/deploy/upgrade.md +++ b/deploy/upgrade.md @@ -72,8 +72,16 @@ kubectl delete -f nvidia-device-plugin.yml ## v4.3.2 -升级前 +升级前: 1. 执行 ``` kubectl create ns fluid-system +``` + +## v4.3.4 + +升级后 +1. 执行以下sql语句,其中auto_stop_duration为当前默认的notebook自动停止时间(秒),可替换为当前部署配置文件autoStopIntervalSec配置项的值 +``` +update notebook set auto_stop_duration = 14400 where auto_stop_duration = 0 ``` \ No newline at end of file diff --git a/openai-portal/src/views/modelDev/components/notebook/notebookCreation.vue b/openai-portal/src/views/modelDev/components/notebook/notebookCreation.vue index 929f5025..8d0e0fda 100644 --- a/openai-portal/src/views/modelDev/components/notebook/notebookCreation.vue +++ b/openai-portal/src/views/modelDev/components/notebook/notebookCreation.vue @@ -98,6 +98,17 @@ + + + + + + 小时 + + 高级设置 @@ -109,11 +120,11 @@ - + -
服务端口环境变量为OCTOPUS_NOTEBOOK_PORT,基础URL环境变量为OCTOPUS_NOTEBOOK_BASE_URL -
+
+ 服务端口环境变量为OCTOPUS_NOTEBOOK_PORT,基础URL环境变量为OCTOPUS_NOTEBOOK_BASE_URL +
+ +
+ 自动停止: + {{profileInfo.autoStopDuration == -1 ? '任务不会自动停止' : profileInfo.autoStopDuration/3600 + '小时'}} +
+
diff --git a/server/admin-server/api/v1/develop.proto b/server/admin-server/api/v1/develop.proto index e4e5a1d4..86684dfd 100644 --- a/server/admin-server/api/v1/develop.proto +++ b/server/admin-server/api/v1/develop.proto @@ -93,6 +93,7 @@ message Notebook { string resourcePool=27; string exitMsg = 28; string command = 29; + int64 autoStopDuration = 30; } message ListNotebookReply { diff --git a/server/base-server/api/v1/develop.proto b/server/base-server/api/v1/develop.proto index 79ea1c13..b4fe44be 100644 --- a/server/base-server/api/v1/develop.proto +++ b/server/base-server/api/v1/develop.proto @@ -52,6 +52,7 @@ message CreateNotebookRequest { map envs = 15; string command = 16; bool disableMountUserHome = 17; + int64 autoStopDuration = 18; } message CreateNotebookReply { @@ -127,6 +128,7 @@ message Notebook { string imageUrl = 25; string exitMsg = 26; string command = 27; + int64 autoStopDuration = 28; } message ListNotebookReply { diff --git a/server/base-server/internal/data/dao/model/develop.go b/server/base-server/internal/data/dao/model/develop.go index dbc1966c..506c1fb8 100644 --- a/server/base-server/internal/data/dao/model/develop.go +++ b/server/base-server/internal/data/dao/model/develop.go @@ -38,6 +38,7 @@ type Notebook struct { Envs sql.Map `gorm:"type:json;comment:环境变量"` Command string `gorm:"type:text;comment:启动命令"` DisableMountUserHome bool `gorm:"default:false;comment:是否不挂载userhome目录"` + AutoStopDuration int64 `gorm:"type:int;not null;default:0;comment:自动停止时间(秒)"` DeletedAt soft_delete.DeletedAt `gorm:"uniqueIndex:name_userId_spaceId,priority:4"` } diff --git a/server/base-server/internal/service/develop/develop.go b/server/base-server/internal/service/develop/develop.go index 800f650e..5b2f8927 100644 --- a/server/base-server/internal/service/develop/develop.go +++ b/server/base-server/internal/service/develop/develop.go @@ -417,6 +417,9 @@ func (s *developService) CreateNotebook(ctx context.Context, req *api.CreateNote nb.Status = constant.PREPARING nb.NotebookJobId = jobId nb.TaskNumber = int(req.TaskNumber) + if req.AutoStopDuration == 0 { + nb.AutoStopDuration = s.conf.Service.Develop.AutoStopIntervalSec + } nbJob := &model.NotebookJob{ Id: jobId, diff --git a/server/base-server/internal/service/develop/task.go b/server/base-server/internal/service/develop/task.go index 833a1821..b8f9edd6 100644 --- a/server/base-server/internal/service/develop/task.go +++ b/server/base-server/internal/service/develop/task.go @@ -59,10 +59,10 @@ func (s *developService) startNotebookTask() { utils.HandlePanic(ctx, func(i ...interface{}) { for pageIndex := 1; ; pageIndex++ { notebookJobs, err := s.data.DevelopDao.ListNotebookJob(ctx, &model.NotebookJobQuery{ - PageIndex: pageIndex, - PageSize: taskPageSize, - StartedAtLt: time.Now().Add(-time.Second * time.Duration(s.conf.Service.Develop.AutoStopIntervalSec)).Unix(), - StatusList: utils.NonCompletedStates(), + PageIndex: pageIndex, + PageSize: taskPageSize, + //StartedAtLt: time.Now().Add(-time.Second * time.Duration(s.conf.Service.Develop.AutoStopIntervalSec)).Unix(), + StatusList: utils.NonCompletedStates(), }) if err != nil { @@ -74,12 +74,33 @@ func (s *developService) startNotebookTask() { break } + nbs := make(map[string]*model.Notebook) + nbIds := make([]string, 0) for _, j := range notebookJobs { - _, err := s.StopNotebook(ctx, &api.StopNotebookRequest{Id: j.NotebookId}) - if err != nil { - s.log.Errorf(ctx, "StopNotebook err: %s", err) - continue + nbIds = append(nbIds, j.NotebookId) + } + + notebooks, _, err := s.data.DevelopDao.ListNotebook(ctx, &model.NotebookQuery{Ids: nbIds}) + for _, n := range notebooks { + nbs[n.Id] = n + } + + for _, j := range notebookJobs { + duration := int64(0) + if nbs[j.NotebookId].AutoStopDuration == 0 { + duration = s.conf.Service.Develop.AutoStopIntervalSec + } else { + duration = nbs[j.NotebookId].AutoStopDuration + } + + if duration > 0 && j.StartedAt != nil && time.Now().Sub(*j.StartedAt).Seconds() >= float64(duration) { + _, err := s.StopNotebook(ctx, &api.StopNotebookRequest{Id: j.NotebookId}) + if err != nil { + s.log.Errorf(ctx, "StopNotebook err: %s", err) + continue + } } + } } })() diff --git a/server/openai-server/api/v1/develop.proto b/server/openai-server/api/v1/develop.proto index 5765ecbd..3676c5dc 100644 --- a/server/openai-server/api/v1/develop.proto +++ b/server/openai-server/api/v1/develop.proto @@ -92,6 +92,7 @@ message CreateNotebookRequest { map envs = 13; string command = 14; bool disableMountUserHome = 15; + int64 autoStopDuration = 16; } message CreateNotebookReply { @@ -171,6 +172,7 @@ message Notebook { string imageUrl = 24; string exitMsg = 25; string command = 26; + int64 autoStopDuration = 27; } message ListNotebookReply {