feat(llm): 添加停止微调任务功能

- 在 application-ymx.yaml 中添加停止微调任务的 API 路径
- 新增 FineTuningTaskHttpService 类,实现停止微调任务的 HTTP 请求
- 修改 AsyncFineTuningTaskService 类,增加停止微调任务的方法
- 更新 FineTuningTaskServiceImpl 类,实现停止微调任务的业务逻辑
This commit is contained in:
Liuyang 2025-02-25 17:23:11 +08:00
parent af0f47c2c7
commit 8dffa602fb
5 changed files with 119 additions and 18 deletions

View File

@ -71,6 +71,9 @@ public class LLMBackendProperties {
@NotNull(message = "创建微调任务 POST")
private String finetuningCreate;
@NotNull(message = "停止微调任务 POST")
private String stopFinetuning;
private String finetuningLog;
private String finetuningDetail;

View File

@ -13,15 +13,16 @@ import cn.iocoder.yudao.module.llm.dal.mysql.servername.ServerNameMapper;
import cn.iocoder.yudao.module.llm.enums.FinetuningTaskStatusEnum;
import cn.iocoder.yudao.module.llm.service.dataset.DatasetQuestionService;
import cn.iocoder.yudao.module.llm.service.dataset.DatasetService;
import cn.iocoder.yudao.module.llm.service.http.FineTuningTaskHttpService;
import cn.iocoder.yudao.module.llm.service.http.TrainHttpService;
import cn.iocoder.yudao.module.llm.service.http.vo.AigcFineTuningCreateReqVO;
import cn.iocoder.yudao.module.llm.service.http.vo.AigcFineTuningCreateRespVO;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Value;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
@ -49,15 +50,18 @@ public class AsyncFineTuningTaskService {
@Resource
private AsyncDataSetService dataSetService;
@Resource
private FineTuningTaskHttpService fineTuningTaskHttpService;
@Value("${spring.profiles.active}")
private String active;
//大模型平台创建调优任务
@Async
public void createTuning(FineTuningTaskDO fineTuningTask) {
public void createTuning (FineTuningTaskDO fineTuningTask) {
// 记录开始创建任务的日志
log.info("异步创建。 开始创建微调任务,请求参数: {}", fineTuningTask);
try {
log.info("开始创建微调任务任务ID: {}", fineTuningTask.getId());
@ -146,10 +150,10 @@ public class AsyncFineTuningTaskService {
}
}
private static AigcFineTuningCreateReqVO getAigcFineTuningCreateReqVO(FineTuningTaskDO fineTuningTask) {
private static AigcFineTuningCreateReqVO getAigcFineTuningCreateReqVO (FineTuningTaskDO fineTuningTask) {
AigcFineTuningCreateReqVO req = new AigcFineTuningCreateReqVO();
req.setModel(fineTuningTask.getBaseModel());
req.setTrainEpoch( (fineTuningTask.getEpoch() == 0) ? 1 :fineTuningTask.getEpoch());
req.setTrainEpoch((fineTuningTask.getEpoch() == 0) ? 1 : fineTuningTask.getEpoch());
req.setSuffix(fineTuningTask.getTaskName());
req.setRemark(fineTuningTask.getTaskIntro());
req.setTrainBatchSize(fineTuningTask.getBatchSize());
@ -164,26 +168,45 @@ public class AsyncFineTuningTaskService {
//调优任务部署
@Async
public void startFineTuningTask(FineTuningTaskDO fineTuningTask) {
public void startFineTuningTask (FineTuningTaskDO fineTuningTask) {
try {
createTuning(fineTuningTask);
}catch(Exception e){
} catch (Exception e) {
e.printStackTrace();
};
}
;
}
//调优任务停止
@Async
public void stopFineTuningTask(FineTuningTaskDO fineTuningTask) {
public void stopFineTuningTask (FineTuningTaskDO fineTuningTask) {
try {
trainHttpService.finetuningCancle(new HashMap<>(),fineTuningTask.getJobId());
trainHttpService.finetuningCancle(new HashMap<>(), fineTuningTask.getJobId());
trainHttpService.finetuningDelete(new HashMap<>(), fineTuningTask.getJobId());
fineTuningTask.setStatus(0);
fineTuningTaskMapper.updateById(fineTuningTask);
}catch(Exception e){
} catch (Exception e) {
e.printStackTrace();
};
}
;
}
/**
* 停止微调任务 TODO:先同步调试
*
* @param fineTuningTaskDO 微调任务数据对象
*/
public void stopFinetuning (FineTuningTaskDO fineTuningTaskDO) {
log.info(" ===== 停止微调任务 ===== stopFinetuning");
try {
log.info("开始调用HTTP服务停止微调任务任务模型名称: {}", fineTuningTaskDO.getJobModelName());
fineTuningTaskHttpService.stopFinetuning(fineTuningTaskDO);
log.info("HTTP服务调用成功任务模型名称: {}", fineTuningTaskDO.getJobModelName());
} catch (Exception e) {
log.error("调用HTTP服务停止微调任务时发生异常任务模型名称: {}", fineTuningTaskDO.getJobModelName(), e);
throw new RuntimeException("停止微调任务失败", e);
}
}
}

View File

@ -345,16 +345,36 @@ public class FineTuningTaskServiceImpl implements FineTuningTaskService {
return null;
}
// @Override
// public void stopFineTuningTask (Long id) {
// FineTuningTaskDO fineTuningTaskDO = validateFineTuningTaskExists(id);
// fineTuningTaskMapper.stopStartTask(id, FinetuningTaskStatusEnum.WAITING.getStatus());
// //todo 调用模型服务停止调优任务
// asyncFineTuningTaskService.stopFineTuningTask(fineTuningTaskDO);
//
// }
@Override
public void stopFineTuningTask (Long id) {
public void stopFineTuningTask(Long id) {
log.info(" ===== 停止微调任务 ===== stopFineTuningTask");
// 1. 校验微调任务是否存在
log.info("开始校验微调任务是否存在任务ID: {}", id);
FineTuningTaskDO fineTuningTaskDO = validateFineTuningTaskExists(id);
fineTuningTaskMapper.stopStartTask(id, FinetuningTaskStatusEnum.WAITING.getStatus());
//todo 调用模型服务停止调优任务
asyncFineTuningTaskService.stopFineTuningTask(fineTuningTaskDO);
log.info("微调任务校验成功任务ID: {}", id);
// 2. 修改微调任务状态为已取消
log.info("开始修改微调任务状态为已取消任务ID: {}", id);
fineTuningTaskMapper.stopStartTask(id, FinetuningTaskStatusEnum.CANCELLED.getStatus());
log.info("微调任务状态修改成功任务ID: {}", id);
// 3. 异步调用模型服务停止微调任务
log.info("开始异步调用模型服务停止微调任务任务ID: {}", id);
asyncFineTuningTaskService.stopFinetuning(fineTuningTaskDO);
log.info("异步调用模型服务完成任务ID: {}", id);
}
@Override
public PageResult<FineTuningTaskDO> getFineTuningTaskPage (FineTuningTaskPageReqVO pageReqVO) {
return fineTuningTaskMapper.selectPage(pageReqVO);

View File

@ -0,0 +1,53 @@
package cn.iocoder.yudao.module.llm.service.http;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.iocoder.yudao.framework.common.util.http.HttpUtils;
import cn.iocoder.yudao.module.llm.dal.dataobject.finetuningtask.FineTuningTaskDO;
import cn.iocoder.yudao.module.llm.framework.backend.config.LLMBackendProperties;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.HashMap;
/**
* @Description 微调任务相关接口
*/
@Service
@Slf4j
public class FineTuningTaskHttpService {
@Resource
private LLMBackendProperties llmBackendProperties;
/**
* 停止微调任务
* 该方法通过HTTP请求调用后端服务停止指定的微调任务
*
* @param fineTuningTaskDO 微调任务数据对象包含任务的相关信息
*/
public void stopFinetuning(FineTuningTaskDO fineTuningTaskDO) {
log.info(" ===== 停止微调任务 ===== stopFinetuning");
// 1. 获取停止微调任务的URL
String url = llmBackendProperties.getStopFinetuning();
log.info("获取停止微调任务的URL: {}", url);
// 2. 发送HTTP POST请求停止微调任务
log.info("开始发送HTTP POST请求停止微调任务任务模型名称: {}", fineTuningTaskDO.getJobModelName());
try {
// 使用 try-with-resources 确保 HttpResponse 被正确关闭
try (HttpResponse response = HttpRequest.post(url)
.form("fine_tuned_model", fineTuningTaskDO.getJobModelName())
.timeout(60000)
.executeAsync()) {
String body = response.body();
log.info("HTTP请求完成响应内容: {}", body);
}
} catch (Exception e) {
log.error("发送HTTP请求停止微调任务时发生异常任务模型名称: {}", fineTuningTaskDO.getJobModelName(), e);
throw new RuntimeException("HTTP请求失败", e);
}
}
}

View File

@ -326,6 +326,8 @@ llm:
text_to_image: http://127.0.0.1:5123/generate-image
# 检查点文件列表
check_file_list: /llm/finetuning/checkpoints?model_name=
# 模型调优停止 POST
stop_finetuning: /llm/finetuning/stop
#################### 30000: 大模型对话相关API。 ###################
#### 大模型对话