feat: order env for tensorrt_llm (#10916)

This commit is contained in:
CityFun 2025-11-11 14:09:25 +08:00 committed by GitHub
parent e17bbdd6a7
commit 3773412139
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 68 additions and 32 deletions

View file

@ -13,6 +13,7 @@ import (
"github.com/1Panel-dev/1Panel/agent/global" "github.com/1Panel-dev/1Panel/agent/global"
"github.com/1Panel-dev/1Panel/agent/utils/compose" "github.com/1Panel-dev/1Panel/agent/utils/compose"
"github.com/1Panel-dev/1Panel/agent/utils/docker" "github.com/1Panel-dev/1Panel/agent/utils/docker"
"github.com/1Panel-dev/1Panel/agent/utils/env"
"github.com/1Panel-dev/1Panel/agent/utils/files" "github.com/1Panel-dev/1Panel/agent/utils/files"
"github.com/subosito/gotenv" "github.com/subosito/gotenv"
"gopkg.in/yaml.v3" "gopkg.in/yaml.v3"
@ -171,7 +172,7 @@ func handleLLMParams(llm *model.TensorRTLLM, create request.TensorRTLLMCreate) e
var volumes []interface{} var volumes []interface{}
var defaultVolumes = map[string]string{ var defaultVolumes = map[string]string{
"${MODEL_PATH}": "/models", "${MODEL_PATH}": "${MODEL_PATH}",
} }
for k, v := range defaultVolumes { for k, v := range defaultVolumes {
volumes = append(volumes, fmt.Sprintf("%s:%s", k, v)) volumes = append(volumes, fmt.Sprintf("%s:%s", k, v))
@ -191,23 +192,24 @@ func handleLLMParams(llm *model.TensorRTLLM, create request.TensorRTLLMCreate) e
} }
func handleLLMEnv(llm *model.TensorRTLLM, create request.TensorRTLLMCreate) gotenv.Env { func handleLLMEnv(llm *model.TensorRTLLM, create request.TensorRTLLMCreate) gotenv.Env {
env := make(gotenv.Env) envMap := make(gotenv.Env)
env["CONTAINER_NAME"] = create.ContainerName envMap["CONTAINER_NAME"] = create.ContainerName
env["MODEL_PATH"] = create.ModelDir envMap["MODEL_PATH"] = create.ModelDir
env["VERSION"] = create.Version envMap["VERSION"] = create.Version
env["IMAGE"] = create.Image envMap["IMAGE"] = create.Image
env["COMMAND"] = create.Command envMap["COMMAND"] = create.Command
for i, port := range create.ExposedPorts { for i, port := range create.ExposedPorts {
containerPortStr := fmt.Sprintf("CONTAINER_PORT_%d", i) containerPortStr := fmt.Sprintf("CONTAINER_PORT_%d", i)
hostPortStr := fmt.Sprintf("HOST_PORT_%d", i) hostPortStr := fmt.Sprintf("HOST_PORT_%d", i)
hostIPStr := fmt.Sprintf("HOST_IP_%d", i) hostIPStr := fmt.Sprintf("HOST_IP_%d", i)
env[containerPortStr] = strconv.Itoa(port.ContainerPort) envMap[containerPortStr] = strconv.Itoa(port.ContainerPort)
env[hostPortStr] = strconv.Itoa(port.HostPort) envMap[hostPortStr] = strconv.Itoa(port.HostPort)
env[hostIPStr] = port.HostIP envMap[hostIPStr] = port.HostIP
} }
envStr, _ := gotenv.Marshal(env) orders := []string{"MODEL_PATH", "COMMAND"}
envStr, _ := env.MarshalWithOrder(envMap, orders)
llm.Env = envStr llm.Env = envStr
return env return envMap
} }
func (t TensorRTLLMService) Create(create request.TensorRTLLMCreate) error { func (t TensorRTLLMService) Create(create request.TensorRTLLMCreate) error {
@ -250,10 +252,10 @@ func (t TensorRTLLMService) Create(create request.TensorRTLLMCreate) error {
if err := handleLLMParams(tensorrtLLM, create); err != nil { if err := handleLLMParams(tensorrtLLM, create); err != nil {
return err return err
} }
env := handleLLMEnv(tensorrtLLM, create) envMap := handleLLMEnv(tensorrtLLM, create)
llmDir := path.Join(global.Dir.TensorRTLLMDir, create.Name) llmDir := path.Join(global.Dir.TensorRTLLMDir, create.Name)
envPath := path.Join(llmDir, ".env") envPath := path.Join(llmDir, ".env")
if err := gotenv.Write(env, envPath); err != nil { if err := env.Write(envMap, envPath); err != nil {
return err return err
} }
dockerComposePath := path.Join(llmDir, "docker-compose.yml") dockerComposePath := path.Join(llmDir, "docker-compose.yml")
@ -287,12 +289,12 @@ func (t TensorRTLLMService) Update(req request.TensorRTLLMUpdate) error {
return err return err
} }
env := handleLLMEnv(tensorrtLLM, req.TensorRTLLMCreate) envMap := handleLLMEnv(tensorrtLLM, req.TensorRTLLMCreate)
envStr, _ := gotenv.Marshal(env) envStr, _ := gotenv.Marshal(envMap)
tensorrtLLM.Env = envStr tensorrtLLM.Env = envStr
llmDir := path.Join(global.Dir.TensorRTLLMDir, tensorrtLLM.Name) llmDir := path.Join(global.Dir.TensorRTLLMDir, tensorrtLLM.Name)
envPath := path.Join(llmDir, ".env") envPath := path.Join(llmDir, ".env")
if err := gotenv.Write(env, envPath); err != nil { if err := env.Write(envMap, envPath); err != nil {
return err return err
} }
dockerComposePath := path.Join(llmDir, "docker-compose.yml") dockerComposePath := path.Join(llmDir, "docker-compose.yml")

View file

@ -10,7 +10,7 @@ import (
) )
func Write(envMap map[string]string, filename string) error { func Write(envMap map[string]string, filename string) error {
content, err := marshal(envMap) content, err := Marshal(envMap)
if err != nil { if err != nil {
return err return err
} }
@ -26,7 +26,7 @@ func Write(envMap map[string]string, filename string) error {
return file.Sync() return file.Sync()
} }
func marshal(envMap map[string]string) (string, error) { func Marshal(envMap map[string]string) (string, error) {
lines := make([]string, 0, len(envMap)) lines := make([]string, 0, len(envMap))
for k, v := range envMap { for k, v := range envMap {
if d, err := strconv.Atoi(v); err == nil && !isStartWithZero(v) { if d, err := strconv.Atoi(v); err == nil && !isStartWithZero(v) {
@ -37,10 +37,47 @@ func marshal(envMap map[string]string) (string, error) {
lines = append(lines, fmt.Sprintf(`%s="%s"`, k, v)) lines = append(lines, fmt.Sprintf(`%s="%s"`, k, v))
} }
} }
sort.Strings(lines)
return strings.Join(lines, "\n"), nil return strings.Join(lines, "\n"), nil
} }
func MarshalWithOrder(envMap map[string]string, orders []string) (string, error) {
lines := make([]string, 0, len(envMap))
for _, k := range orders {
if v, ok := envMap[k]; ok {
lines = append(lines, formatEnvLine(k, v))
}
}
extraKeys := make([]string, 0)
for k := range envMap {
found := false
for _, okk := range orders {
if k == okk {
found = true
break
}
}
if !found {
extraKeys = append(extraKeys, k)
}
}
sort.Strings(extraKeys)
for _, k := range extraKeys {
lines = append(lines, formatEnvLine(k, envMap[k]))
}
return strings.Join(lines, "\n"), nil
}
func formatEnvLine(k, v string) string {
if d, err := strconv.Atoi(v); err == nil && !isStartWithZero(v) {
return fmt.Sprintf(`%s=%d`, k, d)
} else if hasEvenDoubleQuotes(v) {
return fmt.Sprintf(`%s='%s'`, k, v)
} else {
return fmt.Sprintf(`%s="%s"`, k, v)
}
}
func GetEnvValueByKey(envPath, key string) (string, error) { func GetEnvValueByKey(envPath, key string) (string, error) {
envMap, err := godotenv.Read(envPath) envMap, err := godotenv.Read(envPath)
if err != nil { if err != nil {

View file

@ -744,7 +744,7 @@ const message = {
llm: 'TensorRT LLM', llm: 'TensorRT LLM',
modelDir: 'Model Directory', modelDir: 'Model Directory',
commandHelper: commandHelper:
'After /models in the startup command, the model name needs to be completed; if external access is required, set the port in the command to be the same as the application port', 'If external access is needed, set the port in the command to be the same as the application port',
imageAlert: imageAlert:
'Due to the large image size, it is recommended to manually download the image to the server before installation', 'Due to the large image size, it is recommended to manually download the image to the server before installation',
modelSpeedup: 'Enable model acceleration', modelSpeedup: 'Enable model acceleration',

View file

@ -744,7 +744,7 @@ const message = {
llm: 'TensorRT LLM', llm: 'TensorRT LLM',
modelDir: 'Directorio del Modelo', modelDir: 'Directorio del Modelo',
commandHelper: commandHelper:
'Después de /models en el comando de inicio, se debe completar el nombre del modelo; si se requiere acceso externo, configure el puerto en el comando para que sea el mismo que el puerto de la aplicación', 'Si se necesita acceso externo, establezca el puerto en el comando para que sea el mismo que el puerto de la aplicación',
imageAlert: imageAlert:
'Debido al gran tamaño de la imagen, se recomienda descargar manualmente la imagen al servidor antes de la instalación', 'Debido al gran tamaño de la imagen, se recomienda descargar manualmente la imagen al servidor antes de la instalación',
modelSpeedup: 'Habilitar aceleración de modelo', modelSpeedup: 'Habilitar aceleración de modelo',

View file

@ -731,7 +731,7 @@ const message = {
llm: 'TensorRT LLM', llm: 'TensorRT LLM',
modelDir: 'モデルディレクトリ', modelDir: 'モデルディレクトリ',
commandHelper: commandHelper:
'起動コマンドの /models の後にはモデル名を補完する必要があります外部アクセスが必要な場合はコマンド内のポートをアプリケーションポートと同じに設定してください', '外部アクセスが必要な場合はコマンド内のポートをアプリケーションポートと同じに設定してください',
imageAlert: imageAlert:
'イメージサイズが大きいためインストール前にサーバーにイメージを手動でダウンロードすることをお勧めします', 'イメージサイズが大きいためインストール前にサーバーにイメージを手動でダウンロードすることをお勧めします',
modelSpeedup: 'モデル加速を有効化', modelSpeedup: 'モデル加速を有効化',

View file

@ -726,8 +726,7 @@ const message = {
tensorRT: { tensorRT: {
llm: 'TensorRT LLM', llm: 'TensorRT LLM',
modelDir: '모델 디렉토리', modelDir: '모델 디렉토리',
commandHelper: commandHelper: '외부 액세스가 필요한 경우 명령에서 포트를 애플리케이션 포트와 동일하게 설정하십시오',
'시작 명령의 /models 뒤에는 모델 이름을 완성해야 합니다; 외부 액세스가 필요한 경우 명령의 포트를 애플리케이션 포트와 동일하게 설정하세요',
imageAlert: '이미지 크기가 크므로 설치 전에 서버에 이미지를 수동으로 다운로드하는 것이 좋습니다', imageAlert: '이미지 크기가 크므로 설치 전에 서버에 이미지를 수동으로 다운로드하는 것이 좋습니다',
modelSpeedup: '모델 가속 활성화', modelSpeedup: '모델 가속 활성화',
modelType: '모델 유형', modelType: '모델 유형',

View file

@ -743,8 +743,7 @@ const message = {
tensorRT: { tensorRT: {
llm: 'TensorRT LLM', llm: 'TensorRT LLM',
modelDir: 'Direktori Model', modelDir: 'Direktori Model',
commandHelper: commandHelper: 'Jika akses luar diperlukan, tetapkan port dalam arahan sama dengan port aplikasi',
'Selepas /models dalam arahan permulaan, nama model perlu dilengkapkan; jika akses luar diperlukan, tetapkan port dalam arahan sama dengan port aplikasi',
imageAlert: imageAlert:
'Disebabkan saiz imej yang besar, disyorkan untuk memuat turun imej secara manual ke pelayan sebelum pemasangan', 'Disebabkan saiz imej yang besar, disyorkan untuk memuat turun imej secara manual ke pelayan sebelum pemasangan',
modelSpeedup: 'Dayakan pecutan model', modelSpeedup: 'Dayakan pecutan model',

View file

@ -740,7 +740,7 @@ const message = {
llm: 'TensorRT LLM', llm: 'TensorRT LLM',
modelDir: 'Diretório do Modelo', modelDir: 'Diretório do Modelo',
commandHelper: commandHelper:
'Após /models no comando de inicialização, o nome do modelo precisa ser completado; se for necessário acesso externo, defina a porta no comando para ser a mesma que a porta do aplicativo', 'Se for necessário acesso externo, defina a porta no comando para ser a mesma que a porta do aplicativo',
imageAlert: imageAlert:
'Devido ao grande tamanho da imagem, recomenda-se baixar manualmente a imagem para o servidor antes da instalação', 'Devido ao grande tamanho da imagem, recomenda-se baixar manualmente a imagem para o servidor antes da instalação',
modelSpeedup: 'Ativar aceleração de modelo', modelSpeedup: 'Ativar aceleração de modelo',

View file

@ -737,8 +737,7 @@ const message = {
tensorRT: { tensorRT: {
llm: 'TensorRT LLM', llm: 'TensorRT LLM',
modelDir: 'Каталог модели', modelDir: 'Каталог модели',
commandHelper: commandHelper: 'Если требуется внешний доступ, установите порт в команде таким же, как порт приложения',
'После /models в команде запуска необходимо указать имя модели; если требуется внешний доступ, установите порт в команде таким же, как порт приложения',
imageAlert: imageAlert:
'Из-за большого размера образа рекомендуется вручную загрузить образ на сервер перед установкой', 'Из-за большого размера образа рекомендуется вручную загрузить образ на сервер перед установкой',
modelSpeedup: 'Включить ускорение модели', modelSpeedup: 'Включить ускорение модели',

View file

@ -752,7 +752,7 @@ const message = {
llm: 'TensorRT LLM', llm: 'TensorRT LLM',
modelDir: 'Model Dizini', modelDir: 'Model Dizini',
commandHelper: commandHelper:
'Başlatma komutundaki /models sonrasında model adı tamamlanmalıdır; harici erişim gerekiyorsa, komuttaki bağlantı noktasını uygulama bağlantı noktasıyla aynı olacak şekilde ayarlayın', 'Harici erişim gerekiyorsa, komuttaki bağlantı noktasını uygulama bağlantı noktasıyla aynı olacak şekilde ayarlayın',
imageAlert: imageAlert:
'Görüntü boyutu büyük olduğundan, kurulumdan önce görüntüyü sunucuya manuel olarak indirmeniz önerilir', 'Görüntü boyutu büyük olduğundan, kurulumdan önce görüntüyü sunucuya manuel olarak indirmeniz önerilir',
modelSpeedup: 'Model hızlandırmayı etkinleştir', modelSpeedup: 'Model hızlandırmayı etkinleştir',

View file

@ -714,7 +714,7 @@ const message = {
tensorRT: { tensorRT: {
llm: 'TensorRT LLM', llm: 'TensorRT LLM',
modelDir: '模型目錄', modelDir: '模型目錄',
commandHelper: '啟動指令中的 /models 後需補全模型名稱若需外部訪問請將指令中的埠設定為與應用埠相同', commandHelper: '若需外部訪問請將命令中的端口設置為與應用端口相同',
imageAlert: '由於鏡像較大建議先手動將鏡像下載到伺服器後再進行安裝', imageAlert: '由於鏡像較大建議先手動將鏡像下載到伺服器後再進行安裝',
modelSpeedup: '啟用模型加速', modelSpeedup: '啟用模型加速',
modelType: '模型類型', modelType: '模型類型',