This commit is contained in:
2026-08-29 01:11:01 +08:00
parent 474d561173
commit 5c43370fc9
37 changed files with 1309 additions and 409 deletions
+1
View File
@@ -25,4 +25,5 @@ var (
CodeLabelTaskRunning = gcode.New(1020, "该数据集已有预标注任务进行中", nil)
CodeLocalAiNotConfigured = gcode.New(1021, "标注服务未配置(localAi 节点)", nil)
CodeImageNotFound = gcode.New(1022, "图片不存在", nil)
CodeGenTaskRunning = gcode.New(1023, "该数据集已有生成任务进行中(生成与 VLM 补检显存互斥,等任务完成)", nil)
)
+41
View File
@@ -91,3 +91,44 @@ func (p *LabelTaskPool) Submit(ctx context.Context, fn func(ctx context.Context)
return ctx.Err()
}
}
// GenTaskPool 文生图任务并发池:逐张调 local-ai 生成图片(IO 等待为主),
// 并发度来自 config.yml imageGen.poolSizez-image 显存独占,默认 1),
// 缺失或非法时回退 consts 默认值。池内任务禁止提交本池(防 worker 饿死死锁)。
type GenTaskPool struct {
pool *grpool.Pool
}
var (
genTaskPoolOnce sync.Once
genTaskPool *GenTaskPool
)
// GenTaskPoolInstance 进程级文生图池单例(懒初始化,读取配置)。
func GenTaskPoolInstance() *GenTaskPool {
genTaskPoolOnce.Do(func() {
ctx := context.Background()
size := g.Cfg().MustGet(ctx, "imageGen.poolSize", consts.GenPoolDefaultSize).Int()
if size <= 0 {
size = consts.GenPoolDefaultSize
}
genTaskPool = &GenTaskPool{pool: grpool.New(size, size)}
})
return genTaskPool
}
// Submit 提交单张图片的生成任务并等待完成,返回任务的 error。
func (p *GenTaskPool) Submit(ctx context.Context, fn func(ctx context.Context) error) error {
res := make(chan error, 1)
if err := p.pool.Add(ctx, func(ctx context.Context) {
res <- fn(ctx)
}); err != nil {
return err
}
select {
case err := <-res:
return err
case <-ctx.Done():
return ctx.Err()
}
}
+6 -4
View File
@@ -12,7 +12,8 @@ import (
// 训练体系运行时数据布局(config.yml app.datasetDir,默认 ./workspace,挂载持久化、不提交 git):
//
// datasets/<name>/ 数据集图片(平铺,文件名唯一,标注存 DB dataset_image.labels_json
// trainings/<name>.tflite 某数据集当前生效模型(训练成功即直写,客户端固定下载,无存档回退
// trainings/<model>.tflite 某数据集当前生效模型(训练成功即直写,客户端固定下载,无存档回退
// <model> = 数据集文件名前缀 name_prefix,空则回退数据集名,2026-08-28)
//
// 训练机与 Go 服务器异机时,数据集经 training 通道同步(见 common/training_runner.go)。
@@ -26,9 +27,10 @@ func DatasetImagesDir(ctx context.Context, datasetName string) string {
return filepath.Join(DatasetDir(ctx), "datasets", datasetName)
}
// TrainingModelPath 某数据集当前生效模型文件(训练成功即从训练机直写,客户端固定下载)
func TrainingModelPath(ctx context.Context, datasetName string) string {
return filepath.Join(DatasetDir(ctx), "trainings", datasetName+".tflite")
// TrainingModelPath 当前生效模型文件路径(modelName 为模型文件基名 = 数据集文件名前缀,
// 空则回退数据集名——见 service.modelFileName;训练成功即从训练机直写,客户端固定下载)
func TrainingModelPath(ctx context.Context, modelName string) string {
return filepath.Join(DatasetDir(ctx), "trainings", modelName+".tflite")
}
// Sha256Hex 计算文件内容 SHA-256 十六进制(模型版本校验用)