更改推理结构
This commit is contained in:
348
models/Model.go
348
models/Model.go
@@ -11,6 +11,7 @@ import (
|
||||
"net/url"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"encoding/base64"
|
||||
@@ -43,184 +44,112 @@ type Model struct {
|
||||
UpdatedAt time.Time `json:"updated_at" gorm:"autoUpdateTime"`
|
||||
}
|
||||
|
||||
// 创建一个带缓冲的通道,缓冲区大小为 10
|
||||
// var ch = make(chan int, 10)
|
||||
|
||||
func init() {
|
||||
configs.ORMDB().AutoMigrate(&Model{})
|
||||
|
||||
// 检查 images 目录是否存在, 不存在则创建
|
||||
if _, err := os.Stat("data/images"); err != nil {
|
||||
if err := os.MkdirAll("data/images", 0777); err != nil {
|
||||
log.Println(err)
|
||||
}
|
||||
}
|
||||
|
||||
// 处理推理任务
|
||||
//go func() {
|
||||
// for {
|
||||
// // 从通道中取出一个数据
|
||||
// model := <-ch
|
||||
// // 模型状态变化时, 向监听此模型的所有连接发送消息
|
||||
// }
|
||||
//}()
|
||||
}
|
||||
|
||||
// 从数据库加载
|
||||
func (model *Model) Load() {
|
||||
configs.ORMDB().First(&model)
|
||||
}
|
||||
|
||||
// 推理模型
|
||||
func (model *Model) Inference(image_list []Image, callback func(Image)) {
|
||||
var server Server
|
||||
|
||||
// 模型未部署到推理機
|
||||
if model.ServerID == "" {
|
||||
//log.Println("模型未部署到推理機, 开始部署模型")
|
||||
log.Println("模型已部署到推理機, 开始推理模型")
|
||||
log.Println("模型未部署到推理機, 开始部署模型")
|
||||
|
||||
var server Server
|
||||
server.IP = "106.15.192.42"
|
||||
server.Port = 7860
|
||||
//if err := configs.ORMDB().Where("models LIKE ?", "%"+model.Name+"%").Take(&server).Error; err != nil {
|
||||
// log.Println(err)
|
||||
// // 如果没有则寻找空闲服务器
|
||||
// // 如果没有空闲则创建新服务器
|
||||
// // 取一台空闲的推理机上传并切换到此模型
|
||||
// // 新建一台推理机上传并切换到此模型
|
||||
//}
|
||||
|
||||
// 执行生成任务
|
||||
if model.Image == "" {
|
||||
img := image_list[0]
|
||||
|
||||
// 发送的参数
|
||||
var datx map[string]interface{} = make(map[string]interface{})
|
||||
datx["prompt"] = img.Prompt // 提示词
|
||||
datx["seed"] = img.Seed // 随机数种子
|
||||
datx["n_iter"] = len(image_list) // 生成图像数量
|
||||
datx["steps"] = img.Steps // 迭代步数
|
||||
datx["cfg_scale"] = img.CfgScale // 提示词引导系数 (CFG Scale)
|
||||
if img.SamplerName == "" {
|
||||
datx["sampler_name"] = img.SamplerName // 采样器名称
|
||||
// 寻找一台就绪的推理机, 且已部署模型目标模型
|
||||
if err := configs.ORMDB().Where("type = ?", "推理").Where("status = ?", "就绪").Where("models LIKE ?", "%"+strconv.Itoa(model.ID)+"%").First(&server).Error; err != nil {
|
||||
// 寻找一台就绪的推理机, 且模型位置仍有空余
|
||||
if err := configs.ORMDB().Where("type = ?", "推理").Where("status = ?", "空闲").Where("length(models) < ?", 5).First(&server).Error; err != nil {
|
||||
log.Println("创建一台新的推理机: 当前禁止创建新服务器")
|
||||
return
|
||||
}
|
||||
fmt.Println("image_list:", datx)
|
||||
// 上传目标模型到推理机
|
||||
log.Println("上传模型到推理机: 当前禁止上传模型")
|
||||
return
|
||||
}
|
||||
|
||||
var data = struct {
|
||||
//EnableHr bool `json:"enable_hr"`
|
||||
//DenoisingStrength int `json:"denoising_strength"`
|
||||
//FirstphaseWidth int `json:"firstphase_width"`
|
||||
//FirstphaseHeight int `json:"firstphase_height"`
|
||||
//HrScale int `json:"hr_scale"`
|
||||
//HrUpscaler string `json:"hr_upscaler"`
|
||||
//HrSecondPassSteps int `json:"hr_second_pass_steps"`
|
||||
//HrResizeX int `json:"hr_resize_x"`
|
||||
//HrResizeY int `json:"hr_resize_y"`
|
||||
//HrSamplerName string `json:"hr_sampler_name"`
|
||||
//HrPrompt string `json:"hr_prompt"`
|
||||
//HrNegativePrompt string `json:"hr_negative_prompt"`
|
||||
Prompt string `json:"prompt"`
|
||||
//Styles []string `json:"styles"`
|
||||
Seed int `json:"seed"`
|
||||
//Subseed int `json:"subseed"`
|
||||
//SubseedStrength int `json:"subseed_strength"`
|
||||
//SeedResizeFromH int `json:"seed_resize_from_h"`
|
||||
//SeedResizeFromW int `json:"seed_resize_from_w"`
|
||||
SamplerName string `json:"sampler_name"`
|
||||
//BatchSize int `json:"batch_size"`
|
||||
NIter int `json:"n_iter"`
|
||||
Steps int `json:"steps"`
|
||||
CfgScale int `json:"cfg_scale"`
|
||||
//Width int `json:"width"`
|
||||
//Height int `json:"height"`
|
||||
//RestoreFaces bool `json:"restore_faces"`
|
||||
//Tiling bool `json:"tiling"`
|
||||
//DoNotSaveSamples bool `json:"do_not_save_samples"`
|
||||
//DoNotSaveGrid bool `json:"do_not_save_grid"`
|
||||
//NegativePrompt string `json:"negative_prompt"`
|
||||
//Eta int `json:"eta"`
|
||||
//SMinUncond int `json:"s_min_uncond"`
|
||||
//SChurn int `json:"s_churn"`
|
||||
//STmax int `json:"s_tmax"`
|
||||
//STmin int `json:"s_tmin"`
|
||||
//SNoise int `json:"s_noise"`
|
||||
//OverrideSettings map[string]string `json:"override_settings"`
|
||||
//OverrideSettingsRestoreAfterwards bool `json:"override_settings_restore_afterwards"`
|
||||
//ScriptArgs []interface{} `json:"script_args"`
|
||||
//SamplerIndex string `json:"sampler_index"`
|
||||
//ScriptName string `json:"script_name"`
|
||||
//SendImages bool `json:"send_images"`
|
||||
//SaveImages bool `json:"save_images"`
|
||||
//AlwaysonScripts map[string]string `json:"alwayson_scripts"`
|
||||
}{
|
||||
//EnableHr: false,
|
||||
//DenoisingStrength: 0,
|
||||
//FirstphaseWidth: 0,
|
||||
//FirstphaseHeight: 0,
|
||||
//HrScale: 2,
|
||||
//HrUpscaler: "nearest",
|
||||
//HrSecondPassSteps: 0,
|
||||
//HrResizeX: 0,
|
||||
//HrResizeY: 0,
|
||||
//HrSamplerName: "",
|
||||
//HrPrompt: "",
|
||||
//HrNegativePrompt: "",
|
||||
Prompt: image_list[0].Prompt,
|
||||
//Styles: []string{},
|
||||
Seed: image_list[0].Seed,
|
||||
//Subseed: -1,
|
||||
//SubseedStrength: 0,
|
||||
//SeedResizeFromH: -1,
|
||||
//SeedResizeFromW: -1,
|
||||
SamplerName: image_list[0].SamplerName, // 采样器名称
|
||||
//BatchSize: 1,
|
||||
NIter: len(image_list), // 1~100
|
||||
Steps: 50, // 1~150
|
||||
CfgScale: image_list[0].CfgScale,
|
||||
//Width: 512,
|
||||
//Height: 512,
|
||||
//RestoreFaces: false,
|
||||
//Tiling: false,
|
||||
//DoNotSaveSamples: false,
|
||||
//DoNotSaveGrid: false,
|
||||
//NegativePrompt: "",
|
||||
//Eta: 0,
|
||||
//SMinUncond: 0,
|
||||
//SChurn: 0,
|
||||
//STmax: 0,
|
||||
//STmin: 0,
|
||||
//SNoise: 1,
|
||||
//OverrideSettings: map[string]string{},
|
||||
//OverrideSettingsRestoreAfterwards: false,
|
||||
//ScriptArgs: []interface{}{},
|
||||
//SamplerIndex: "Euler",
|
||||
//ScriptName: "generate",
|
||||
//SendImages: true,
|
||||
//SaveImages: false,
|
||||
//AlwaysonScripts: map[string]string{},
|
||||
}
|
||||
fmt.Println("data:", data)
|
||||
|
||||
// 接收到的图片列表
|
||||
var rest = struct {
|
||||
Images []string `json:"images"`
|
||||
}{}
|
||||
var url = fmt.Sprintf("http://%s:%d/sdapi/v1/txt2img", server.IP, server.Port)
|
||||
if err := goreq.Post(url).SetJsonBody(datx).Do().BindJSON(&rest); err != nil {
|
||||
log.Println("API 查询失败:", err)
|
||||
}
|
||||
for index, img := range rest.Images {
|
||||
var filename = fmt.Sprintf("%x", md5.Sum([]byte(img)))
|
||||
log.Println("保存图片:", filename)
|
||||
if err := SaveBase64Image(img, "data/images/"+filename+".webp"); err != nil {
|
||||
log.Println(err)
|
||||
var form = struct {
|
||||
Components []struct {
|
||||
ID int `json:"id"`
|
||||
Type string `json:"type"`
|
||||
Props struct {
|
||||
Value string `json:"value"`
|
||||
}
|
||||
image_list[index].Name = filename
|
||||
image_list[index].Path = "data/images/" + filename + ".webp"
|
||||
image_list[index].Hash = filename
|
||||
image_list[index].Type = "image/webp"
|
||||
image_list[index].Width = 512
|
||||
image_list[index].Height = 512
|
||||
image_list[index].Format = "webp"
|
||||
image_list[index].Status = "success"
|
||||
image_list[index].Progress = 100
|
||||
callback(image_list[index])
|
||||
} `json:"components"`
|
||||
}{}
|
||||
// 检查当前是否为目标模型, 不是则执行切换模型 http://106.15.192.42:7860/config
|
||||
if err := goreq.Get(fmt.Sprintf("http://%s:%d/config", server.IP, server.Port)).Do().BindJSON(&form); err != nil {
|
||||
log.Println("获取推理机配置失败:", err)
|
||||
return
|
||||
}
|
||||
|
||||
var isSet = false
|
||||
for _, component := range form.Components {
|
||||
if component.Type == "dropdown" && component.ID == 1514 && component.Props.Value == model.Name {
|
||||
log.Println("当前推理机已经部署了目标模型")
|
||||
isSet = true
|
||||
break
|
||||
}
|
||||
}
|
||||
return
|
||||
|
||||
if !isSet {
|
||||
log.Println("当前推理机未部署目标模型, 开始部署目标模型")
|
||||
// 没有切换模型接口
|
||||
return
|
||||
}
|
||||
|
||||
// 记录到模型
|
||||
model.ServerID = server.ID
|
||||
configs.ORMDB().Save(&model)
|
||||
}
|
||||
|
||||
// 发送的参数
|
||||
var img = image_list[0]
|
||||
var datx map[string]interface{} = make(map[string]interface{})
|
||||
datx["prompt"] = img.Prompt // 提示词
|
||||
datx["seed"] = img.Seed // 随机数种子
|
||||
datx["n_iter"] = len(image_list) // 生成图像数量
|
||||
datx["steps"] = img.Steps // 迭代步数
|
||||
datx["cfg_scale"] = img.CfgScale // 提示词引导系数 (CFG Scale)
|
||||
if img.SamplerName == "" {
|
||||
datx["sampler_name"] = img.SamplerName // 采样器名称
|
||||
}
|
||||
fmt.Println("image_list:", datx)
|
||||
|
||||
// 接收到的图片列表
|
||||
var rest = struct {
|
||||
Images []string `json:"images"`
|
||||
}{}
|
||||
var url = fmt.Sprintf("http://%s:%d/sdapi/v1/txt2img", server.IP, server.Port)
|
||||
if err := goreq.Post(url).SetJsonBody(datx).Do().BindJSON(&rest); err != nil {
|
||||
log.Println("API 查询失败:", err)
|
||||
}
|
||||
for index, img := range rest.Images {
|
||||
var filename = fmt.Sprintf("%x", md5.Sum([]byte(img)))
|
||||
log.Println("保存图片:", filename)
|
||||
if err := SaveBase64Image(img, "data/images/"+filename+".webp"); err != nil {
|
||||
log.Println(err)
|
||||
}
|
||||
image_list[index].Name = filename
|
||||
image_list[index].Path = "data/images/" + filename + ".webp"
|
||||
image_list[index].Hash = filename
|
||||
image_list[index].Type = "image/webp"
|
||||
image_list[index].Width = 512
|
||||
image_list[index].Height = 512
|
||||
image_list[index].Format = "webp"
|
||||
image_list[index].Status = "success"
|
||||
image_list[index].Progress = 100
|
||||
callback(image_list[index])
|
||||
}
|
||||
log.Println("模型未部署到推理機, 取消推理模型")
|
||||
}
|
||||
@@ -254,6 +183,7 @@ func SaveBase64Image(base64Str string, filename string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// 训练模型
|
||||
func (model *Model) Train() (err error) {
|
||||
|
||||
// 獲取一臺空閒的訓練機
|
||||
@@ -420,3 +350,101 @@ func (model *Model) Train() (err error) {
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
var data = struct {
|
||||
//EnableHr bool `json:"enable_hr"`
|
||||
//DenoisingStrength int `json:"denoising_strength"`
|
||||
//FirstphaseWidth int `json:"firstphase_width"`
|
||||
//FirstphaseHeight int `json:"firstphase_height"`
|
||||
//HrScale int `json:"hr_scale"`
|
||||
//HrUpscaler string `json:"hr_upscaler"`
|
||||
//HrSecondPassSteps int `json:"hr_second_pass_steps"`
|
||||
//HrResizeX int `json:"hr_resize_x"`
|
||||
//HrResizeY int `json:"hr_resize_y"`
|
||||
//HrSamplerName string `json:"hr_sampler_name"`
|
||||
//HrPrompt string `json:"hr_prompt"`
|
||||
//HrNegativePrompt string `json:"hr_negative_prompt"`
|
||||
Prompt string `json:"prompt"`
|
||||
//Styles []string `json:"styles"`
|
||||
Seed int `json:"seed"`
|
||||
//Subseed int `json:"subseed"`
|
||||
//SubseedStrength int `json:"subseed_strength"`
|
||||
//SeedResizeFromH int `json:"seed_resize_from_h"`
|
||||
//SeedResizeFromW int `json:"seed_resize_from_w"`
|
||||
SamplerName string `json:"sampler_name"`
|
||||
//BatchSize int `json:"batch_size"`
|
||||
NIter int `json:"n_iter"`
|
||||
Steps int `json:"steps"`
|
||||
CfgScale int `json:"cfg_scale"`
|
||||
//Width int `json:"width"`
|
||||
//Height int `json:"height"`
|
||||
//RestoreFaces bool `json:"restore_faces"`
|
||||
//Tiling bool `json:"tiling"`
|
||||
//DoNotSaveSamples bool `json:"do_not_save_samples"`
|
||||
//DoNotSaveGrid bool `json:"do_not_save_grid"`
|
||||
//NegativePrompt string `json:"negative_prompt"`
|
||||
//Eta int `json:"eta"`
|
||||
//SMinUncond int `json:"s_min_uncond"`
|
||||
//SChurn int `json:"s_churn"`
|
||||
//STmax int `json:"s_tmax"`
|
||||
//STmin int `json:"s_tmin"`
|
||||
//SNoise int `json:"s_noise"`
|
||||
//OverrideSettings map[string]string `json:"override_settings"`
|
||||
//OverrideSettingsRestoreAfterwards bool `json:"override_settings_restore_afterwards"`
|
||||
//ScriptArgs []interface{} `json:"script_args"`
|
||||
//SamplerIndex string `json:"sampler_index"`
|
||||
//ScriptName string `json:"script_name"`
|
||||
//SendImages bool `json:"send_images"`
|
||||
//SaveImages bool `json:"save_images"`
|
||||
//AlwaysonScripts map[string]string `json:"alwayson_scripts"`
|
||||
}{
|
||||
//EnableHr: false,
|
||||
//DenoisingStrength: 0,
|
||||
//FirstphaseWidth: 0,
|
||||
//FirstphaseHeight: 0,
|
||||
//HrScale: 2,
|
||||
//HrUpscaler: "nearest",
|
||||
//HrSecondPassSteps: 0,
|
||||
//HrResizeX: 0,
|
||||
//HrResizeY: 0,
|
||||
//HrSamplerName: "",
|
||||
//HrPrompt: "",
|
||||
//HrNegativePrompt: "",
|
||||
Prompt: image_list[0].Prompt,
|
||||
//Styles: []string{},
|
||||
Seed: image_list[0].Seed,
|
||||
//Subseed: -1,
|
||||
//SubseedStrength: 0,
|
||||
//SeedResizeFromH: -1,
|
||||
//SeedResizeFromW: -1,
|
||||
SamplerName: image_list[0].SamplerName, // 采样器名称
|
||||
//BatchSize: 1,
|
||||
NIter: len(image_list), // 1~100
|
||||
Steps: 50, // 1~150
|
||||
CfgScale: image_list[0].CfgScale,
|
||||
//Width: 512,
|
||||
//Height: 512,
|
||||
//RestoreFaces: false,
|
||||
//Tiling: false,
|
||||
//DoNotSaveSamples: false,
|
||||
//DoNotSaveGrid: false,
|
||||
//NegativePrompt: "",
|
||||
//Eta: 0,
|
||||
//SMinUncond: 0,
|
||||
//SChurn: 0,
|
||||
//STmax: 0,
|
||||
//STmin: 0,
|
||||
//SNoise: 1,
|
||||
//OverrideSettings: map[string]string{},
|
||||
//OverrideSettingsRestoreAfterwards: false,
|
||||
//ScriptArgs: []interface{}{},
|
||||
//SamplerIndex: "Euler",
|
||||
//ScriptName: "generate",
|
||||
//SendImages: true,
|
||||
//SaveImages: false,
|
||||
//AlwaysonScripts: map[string]string{},
|
||||
}
|
||||
fmt.Println("data:", data)
|
||||
**/
|
||||
|
Reference in New Issue
Block a user