diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/framework/backend/config/LLMBackendProperties.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/framework/backend/config/LLMBackendProperties.java index fe6f4b2ce..9745977ca 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/framework/backend/config/LLMBackendProperties.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/framework/backend/config/LLMBackendProperties.java @@ -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; diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/async/AsyncFineTuningTaskService.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/async/AsyncFineTuningTaskService.java index b5b837164..8cf1f906f 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/async/AsyncFineTuningTaskService.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/async/AsyncFineTuningTaskService.java @@ -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); + } } } diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/finetuningtask/FineTuningTaskServiceImpl.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/finetuningtask/FineTuningTaskServiceImpl.java index 976396488..2a2b99f3c 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/finetuningtask/FineTuningTaskServiceImpl.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/finetuningtask/FineTuningTaskServiceImpl.java @@ -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 getFineTuningTaskPage (FineTuningTaskPageReqVO pageReqVO) { return fineTuningTaskMapper.selectPage(pageReqVO); diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/http/FineTuningTaskHttpService.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/http/FineTuningTaskHttpService.java new file mode 100644 index 000000000..cb90ba7ae --- /dev/null +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/http/FineTuningTaskHttpService.java @@ -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); + } + } +} diff --git a/yudao-server/src/main/resources/application-ymx.yaml b/yudao-server/src/main/resources/application-ymx.yaml index b88bce0c5..23e52b721 100644 --- a/yudao-server/src/main/resources/application-ymx.yaml +++ b/yudao-server/src/main/resources/application-ymx.yaml @@ -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。 ################### #### 大模型对话