추론상세 진행상태

This commit is contained in:
Moon
2026-01-12 21:05:24 +09:00
parent ededc512d6
commit d69e10a024
7 changed files with 186 additions and 10 deletions

View File

@@ -1,8 +1,10 @@
package com.kamco.cd.kamcoback.inference;
import com.kamco.cd.kamcoback.config.api.ApiResponseDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.InferenceServerStatusDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.InferenceStatusDetailDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.ResultList;
import com.kamco.cd.kamcoback.inference.service.InferenceResultService;
import com.kamco.cd.kamcoback.mapsheet.service.MapSheetMngService;
@@ -23,6 +25,7 @@ import java.util.UUID;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -237,4 +240,30 @@ public class InferenceResultApiController {
return ApiResponseDto.ok(inferenceResultService.getInferenceServerStatusList());
}
@Operation(summary = "추론관리 진행현황 상세", description = "어드민 홈 > 추론관리 > 추론관리 > 진행현황 상세")
@ApiResponses(
value = {
@ApiResponse(
responseCode = "200",
description = "검색 성공",
content =
@Content(
mediaType = "application/json",
schema = @Schema(implementation = Page.class))),
@ApiResponse(responseCode = "400", description = "잘못된 검색 조건", content = @Content),
@ApiResponse(responseCode = "500", description = "서버 오류", content = @Content)
})
@GetMapping("/status/{uuid}")
public ApiResponseDto<InferenceStatusDetailDto> getInferenceStatus(
@io.swagger.v3.oas.annotations.parameters.RequestBody(
description = "모델 삭제 요청 정보",
required = true)
@PathVariable
UUID uuid) {
return ApiResponseDto.ok(inferenceResultService.getInferenceStatus(uuid));
}
}

View File

@@ -198,6 +198,72 @@ public class InferenceResultDto {
private String mapSheetName;
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public static class InferenceStatusDetailDto {
private String title;
private Integer compareYyyy;
private Integer targetYyyy;
private String detectOption;
private String mapSheetScope;
@JsonFormatDttm private ZonedDateTime inferStartDttm;
@JsonFormatDttm private ZonedDateTime inferEndDttm;
private Long detectingCnt;
private String model1Ver;
private String model2Ver;
private String model3Ver;
public InferenceStatusDetailDto(
String title,
Integer compareYyyy,
Integer targetYyyy,
String detectOption,
String mapSheetScope,
ZonedDateTime inferStartDttm,
ZonedDateTime inferEndDttm,
Long detectingCnt,
String model1Ver,
String model2Ver,
String model3Ver) {
this.title = title;
this.compareYyyy = compareYyyy;
this.targetYyyy = targetYyyy;
this.detectOption = detectOption;
this.mapSheetScope = mapSheetScope;
this.inferStartDttm = inferStartDttm;
this.inferEndDttm = inferEndDttm;
this.detectingCnt = detectingCnt;
this.model1Ver = model1Ver;
this.model2Ver = model2Ver;
this.model3Ver = model3Ver;
}
private String usedServerName;
private Long detectingEndCnt = 7L;
private String model1VerStatus = "PROCCESING";
private String model1VerStatusName = "진행중";
private String model2VerStatus = "PROCCESING";
private String model2VerStatusName = "진행중";
private String model3VerStatus = "PROCCESING";
private String model4VerStatusName = "진행중";
public String getDetectOptionName()
{
if( this.detectOption.equals("EXCL") )return "추론제외";
return "이전 년도 도엽 사용";
}
public String getMapSheetScopeName()
{
if( this.detectOption.equals("ALL") )return "전체";
return "부분";
}
}
@Getter
@Setter
@NoArgsConstructor
@@ -211,12 +277,6 @@ public class InferenceResultDto {
@JsonIgnore private float memused;
private Long kbmemused;
private float gpuUtil;
//private String cpuStatusName;
//private String memStatusName;
//private String gpuStatusName;
//private float cpu_use_rate;
//private float gpu_use_rate;
//private float mem_use_rate;
public float getCpuUseRate()
{

View File

@@ -12,6 +12,7 @@ import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto.MapSheet;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.DetectOption;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.InferenceServerStatusDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.InferenceStatusDetailDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.MapSheetNumDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.MapSheetScope;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.ResultList;
@@ -391,4 +392,21 @@ public class InferenceResultService {
public List<InferenceServerStatusDto> getInferenceServerStatusList() {
return inferenceResultCoreService.getInferenceServerStatusList();
}
public InferenceStatusDetailDto getInferenceStatus(UUID uuid) {
List<InferenceServerStatusDto> servers = inferenceResultCoreService.getInferenceServerStatusList();
String serverNames = "";
for (InferenceServerStatusDto server : servers) {
if( serverNames.equals("") )serverNames = server.getServerName();
else serverNames = serverNames+","+server.getServerName();
}
InferenceStatusDetailDto dto = inferenceResultCoreService.getInferenceStatus(uuid);
dto.setUsedServerName(serverNames);
return dto;
}
}

View File

@@ -86,8 +86,24 @@ public class ModelMngService {
modelMetricAddReq.setLoss(0);
modelMetricAddReq.setIou(0);
ModelUploadResDto modelUploadResDto = new ModelUploadResDto();
try {
FIleChecker.unzip(addReq.getFileName(), addReq.getFilePath());
this.getUnzipModelFiles(addReq.getFilePath(), modelUploadResDto);
addReq.setCdModelPath(modelUploadResDto.getCdModelPath());
addReq.setCdModelFileName(modelUploadResDto.getCdModelFileName());
addReq.setCdModelConfigPath(modelUploadResDto.getCdModelConfigPath());
addReq.setCdModelConfigFileName(modelUploadResDto.getCdModelConfigFileName());
addReq.setClsModelPath(modelUploadResDto.getClsModelPath());
addReq.setClsModelFileName(modelUploadResDto.getClsModelFileName());
} catch (IOException e) {
throw new RuntimeException(e);
}
ObjectMapper mapper = new ObjectMapper();
String filePath = addReq.getClsModelPath() + addReq.getClsModelFileName();
String filePath = modelUploadResDto.getClsModelPath() + modelUploadResDto.getClsModelFileName();
String dataJson = null;
try {
dataJson = Files.readString(Path.of(filePath));
@@ -115,7 +131,7 @@ public class ModelMngService {
}
public ModelUploadResDto uploadChunkModelFile(
UploadDto.UploadAddReq upAddReqDto, MultipartFile chunkFile) {
UploadDto.UploadAddReq upAddReqDto, MultipartFile chunkFile) {
UploadDto.UploadRes upRes = uploadService.uploadChunk(upAddReqDto, chunkFile);
ModelUploadResDto modelUploadResDto = new ModelUploadResDto();
@@ -126,8 +142,9 @@ public class ModelMngService {
modelUploadResDto.setFileName(upRes.getFileName());
modelUploadResDto.setChunkIndex(upRes.getChunkIndex());
modelUploadResDto.setChunkTotalIndex(upRes.getChunkTotalIndex());
// 압축풀기 (String zipFilePath, String destDirectory)
// 압축풀기 (String zipFilePath, String destDirectory)
/*
if (upRes.getChunkIndex() == upRes.getChunkTotalIndex()) {
try {
FIleChecker.unzip(upRes.getFileName(), upRes.getFilePath());
@@ -138,6 +155,7 @@ public class ModelMngService {
throw new RuntimeException(e);
}
}
*/
return modelUploadResDto;
}

View File

@@ -7,6 +7,7 @@ import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto.Dashboard;
import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto.MapSheet;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.InferenceServerStatusDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.InferenceStatusDetailDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.MapSheetNumDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.ResultList;
import com.kamco.cd.kamcoback.postgres.entity.MapInkx5kEntity;
@@ -230,4 +231,8 @@ public class InferenceResultCoreService {
public List<InferenceServerStatusDto> getInferenceServerStatusList(){return mapSheetLearnRepository.getInferenceServerStatusList();
}
public InferenceStatusDetailDto getInferenceStatus(UUID uuid){
return mapSheetLearnRepository.getInferenceStatus(uuid);
}
}

View File

@@ -1,7 +1,9 @@
package com.kamco.cd.kamcoback.postgres.repository.Inference;
import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.InferenceServerStatusDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.InferenceStatusDetailDto;
import com.kamco.cd.kamcoback.postgres.entity.MapSheetLearnEntity;
import java.util.Optional;
import java.util.UUID;
@@ -15,4 +17,6 @@ public interface MapSheetLearnRepositoryCustom {
Optional<MapSheetLearnEntity> getInferenceResultByUuid(UUID uuid);
List<InferenceServerStatusDto> getInferenceServerStatusList();
public InferenceStatusDetailDto getInferenceStatus(UUID uuid);
}

View File

@@ -2,12 +2,17 @@ package com.kamco.cd.kamcoback.postgres.repository.Inference;
import static com.kamco.cd.kamcoback.postgres.entity.QGpuMetricEntity.gpuMetricEntity;
import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetLearnEntity.mapSheetLearnEntity;
import static com.kamco.cd.kamcoback.postgres.entity.QModelMngEntity.modelMngEntity;
import static com.kamco.cd.kamcoback.postgres.entity.QSystemMetricEntity.systemMetricEntity;
import com.kamco.cd.kamcoback.common.utils.DateRange;
import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.InferenceServerStatusDto;
import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.InferenceStatusDetailDto;
import com.kamco.cd.kamcoback.model.service.ModelMngService;
import com.kamco.cd.kamcoback.postgres.entity.MapSheetLearnEntity;
import com.kamco.cd.kamcoback.postgres.entity.QModelMngEntity;
import com.querydsl.core.BooleanBuilder;
import com.querydsl.core.types.Projections;
import com.querydsl.core.types.dsl.CaseBuilder;
@@ -28,6 +33,7 @@ import org.springframework.stereotype.Repository;
public class MapSheetLearnRepositoryImpl implements MapSheetLearnRepositoryCustom {
private final JPAQueryFactory queryFactory;
private final ModelMngService modelMngService;
@Override
public Page<MapSheetLearnEntity> getInferenceMgnResultList(InferenceResultDto.SearchListReq req) {
@@ -117,7 +123,8 @@ public class MapSheetLearnRepositoryImpl implements MapSheetLearnRepositoryCusto
gpuMetricEntity.gpuUtil
))
.from(systemMetricEntity)
.leftJoin(gpuMetricEntity).on(gpuMetricEntity.serverName.eq(systemMetricEntity.serverName))
.leftJoin(gpuMetricEntity).on(gpuMetricEntity.id1.in(latestGpuIds)
.and(gpuMetricEntity.serverName.eq(systemMetricEntity.serverName)))
.where(systemMetricEntity.id1.in(latestIds)) // In 절 사용
.orderBy(systemMetricEntity.serverName.asc())
.limit(4)
@@ -125,4 +132,39 @@ public class MapSheetLearnRepositoryImpl implements MapSheetLearnRepositoryCusto
return foundContent;
}
@Override
public InferenceStatusDetailDto getInferenceStatus(UUID uuid) {
String serverNames = "";
QModelMngEntity m1Model = new QModelMngEntity("m1Model");
QModelMngEntity m2Model = new QModelMngEntity("m2Model");
QModelMngEntity m3Model = new QModelMngEntity("m3Model");
InferenceStatusDetailDto foundContent = queryFactory
.select(Projections.constructor(
InferenceStatusDetailDto.class,
mapSheetLearnEntity.title,
mapSheetLearnEntity.compareYyyy,
mapSheetLearnEntity.targetYyyy,
mapSheetLearnEntity.detectOption,
mapSheetLearnEntity.mapSheetScope,
mapSheetLearnEntity.inferStartDttm,
mapSheetLearnEntity.inferEndDttm,
mapSheetLearnEntity.detectingCnt,
m1Model.modelVer.as("model1Ver"),
m2Model.modelVer.as("model2Ver"),
m3Model.modelVer.as("model3Ver")
))
.from(mapSheetLearnEntity)
.leftJoin(m1Model).on(m1Model.uuid.eq(mapSheetLearnEntity.m1ModelUuid))
.leftJoin(m2Model).on(m2Model.uuid.eq(mapSheetLearnEntity.m2ModelUuid))
.leftJoin(m3Model).on(m3Model.uuid.eq(mapSheetLearnEntity.m3ModelUuid))
.where(mapSheetLearnEntity.uuid.eq(uuid))
.fetchOne();
return foundContent;
}
}