분류 하이퍼파라미터 목록,상세,등록,수정,삭제 커밋
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
package com.kamco.cd.training.common.dto;
|
||||
|
||||
import com.kamco.cd.training.common.enums.ModelType;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class HyperClsParam {
|
||||
|
||||
@Schema(description = "모델", example = "CLS")
|
||||
private ModelType model; // G1, G2, G3, G4, CLS
|
||||
|
||||
// -------------------------
|
||||
// Model
|
||||
// -------------------------
|
||||
|
||||
@Schema(description = "입력 이미지 크기", example = "256")
|
||||
private String inputSize; // input_size
|
||||
|
||||
@Schema(description = "배치 크기(Per GPU)", example = "64")
|
||||
private Integer batchSize; // batch_size
|
||||
|
||||
@Schema(description = "워커 수", example = "16")
|
||||
private Integer workers; // batch_size
|
||||
|
||||
// -------------------------
|
||||
// Augmentation
|
||||
// -------------------------
|
||||
@Schema(description = "scale", example = "0.5")
|
||||
private Double scale;
|
||||
|
||||
@Schema(description = "translate", example = "0.1")
|
||||
private Double translate;
|
||||
|
||||
@Schema(description = "fliplr", example = "0.5")
|
||||
private Double fliplr;
|
||||
|
||||
@Schema(description = "flipud", example = "0.5")
|
||||
private Double flipud;
|
||||
|
||||
@Schema(description = "erasing")
|
||||
private Double erasing;
|
||||
|
||||
@Schema(description = "mixup", example = "0.1")
|
||||
private Double mixup;
|
||||
|
||||
@Schema(description = "hsv_h")
|
||||
private Double hsvH;
|
||||
|
||||
@Schema(description = "hsv_s")
|
||||
private Double hsvS;
|
||||
|
||||
@Schema(description = "hsv_v")
|
||||
private Double hsvV;
|
||||
|
||||
@Schema(description = "dropout")
|
||||
private Double dropout;
|
||||
|
||||
@Schema(description = "label_smoothing")
|
||||
private Double labelSmoothing;
|
||||
|
||||
// -------------------------
|
||||
// Memo
|
||||
// -------------------------
|
||||
@Schema(description = "메모", example = "하이퍼파라미터 신규등록")
|
||||
private String memo; // memo
|
||||
|
||||
private Boolean isDefault = false;
|
||||
}
|
||||
@@ -13,7 +13,8 @@ public enum ModelType implements EnumType {
|
||||
G1("G1"),
|
||||
G2("G2"),
|
||||
G3("G3"),
|
||||
G4("G4");
|
||||
G4("G4"),
|
||||
CLS("CLS");
|
||||
|
||||
private String desc;
|
||||
|
||||
|
||||
@@ -0,0 +1,184 @@
|
||||
package com.kamco.cd.training.hyperparam;
|
||||
|
||||
import com.kamco.cd.training.common.dto.HyperClsParam;
|
||||
import com.kamco.cd.training.common.enums.ModelType;
|
||||
import com.kamco.cd.training.config.api.ApiResponseDto;
|
||||
import com.kamco.cd.training.hyperparam.dto.HyperClsParamDto;
|
||||
import com.kamco.cd.training.hyperparam.dto.HyperParamDto;
|
||||
import com.kamco.cd.training.hyperparam.dto.HyperParamDto.List;
|
||||
import com.kamco.cd.training.hyperparam.service.HyperClsParamService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.media.Content;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
||||
import io.swagger.v3.oas.annotations.responses.ApiResponses;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.validation.Valid;
|
||||
import java.time.LocalDate;
|
||||
import java.util.UUID;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
@Tag(name = "분류 하이퍼파라미터 관리", description = "분류 하이퍼파라미터 관리 API")
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
@RequestMapping("/api/hyper-param/cls")
|
||||
public class HyperClsParamApiController {
|
||||
|
||||
private final HyperClsParamService hyperClsParamService;
|
||||
|
||||
@Operation(summary = "하이퍼파라미터 등록", description = "파라미터를 신규 저장")
|
||||
@ApiResponses(
|
||||
value = {
|
||||
@ApiResponse(
|
||||
responseCode = "200",
|
||||
description = "등록 성공",
|
||||
content =
|
||||
@Content(
|
||||
mediaType = "application/json",
|
||||
schema = @Schema(implementation = String.class))),
|
||||
@ApiResponse(responseCode = "400", description = "잘못된 요청", content = @Content),
|
||||
@ApiResponse(responseCode = "500", description = "서버 오류", content = @Content)
|
||||
})
|
||||
@PostMapping
|
||||
public ApiResponseDto<String> createHyperParam(@Valid @RequestBody HyperClsParam createReq) {
|
||||
String newVersion = hyperClsParamService.createHyperParam(createReq);
|
||||
return ApiResponseDto.ok(newVersion);
|
||||
}
|
||||
|
||||
@Operation(summary = "하이퍼파라미터 수정", description = "파라미터를 수정")
|
||||
@ApiResponses(
|
||||
value = {
|
||||
@ApiResponse(
|
||||
responseCode = "200",
|
||||
description = "등록 성공",
|
||||
content =
|
||||
@Content(
|
||||
mediaType = "application/json",
|
||||
schema = @Schema(implementation = String.class))),
|
||||
@ApiResponse(responseCode = "400", description = "잘못된 요청", content = @Content),
|
||||
@ApiResponse(responseCode = "422", description = "default는 삭제불가", content = @Content),
|
||||
@ApiResponse(responseCode = "500", description = "서버 오류", content = @Content)
|
||||
})
|
||||
@PutMapping("/{uuid}")
|
||||
public ApiResponseDto<String> updateHyperParam(
|
||||
@PathVariable UUID uuid, @Valid @RequestBody HyperClsParam createReq) {
|
||||
return ApiResponseDto.ok(hyperClsParamService.updateHyperParam(uuid, createReq));
|
||||
}
|
||||
|
||||
@Operation(summary = "하이퍼파라미터 목록 조회", description = "하이퍼파라미터 목록 조회")
|
||||
@ApiResponses(
|
||||
value = {
|
||||
@ApiResponse(
|
||||
responseCode = "200",
|
||||
description = "조회 성공",
|
||||
content =
|
||||
@Content(
|
||||
mediaType = "application/json",
|
||||
schema = @Schema(implementation = Page.class))),
|
||||
@ApiResponse(responseCode = "404", description = "하이퍼파라미터를 찾을 수 없음", content = @Content),
|
||||
@ApiResponse(responseCode = "500", description = "서버 오류", content = @Content)
|
||||
})
|
||||
@GetMapping("/list")
|
||||
public ApiResponseDto<Page<List>> getHyperParam(
|
||||
@Parameter(
|
||||
description = "구분 CREATE_DATE(생성일), LAST_USED_DATE(최근사용일)",
|
||||
example = "CREATE_DATE")
|
||||
@RequestParam(required = false)
|
||||
String type,
|
||||
@Parameter(description = "시작일", example = "2026-07-01") @RequestParam(required = false)
|
||||
LocalDate startDate,
|
||||
@Parameter(description = "종료일", example = "2026-12-31") @RequestParam(required = false)
|
||||
LocalDate endDate,
|
||||
@Parameter(description = "버전명", example = "CLS_000001") @RequestParam(required = false)
|
||||
String hyperVer,
|
||||
@Parameter(description = "모델 타입 (G1, G2, G3, G4, CLS 중 하나)", example = "CLS")
|
||||
@RequestParam(required = false)
|
||||
ModelType model,
|
||||
@Parameter(
|
||||
description = "정렬",
|
||||
example = "createdDttm desc",
|
||||
schema =
|
||||
@Schema(
|
||||
allowableValues = {
|
||||
"createdDttm,desc",
|
||||
"lastUsedDttm,desc",
|
||||
"totalUseCnt,desc"
|
||||
}))
|
||||
@RequestParam(required = false)
|
||||
String sort,
|
||||
@Parameter(description = "페이지 번호 (0부터 시작)", example = "0") @RequestParam(defaultValue = "0")
|
||||
int page,
|
||||
@Parameter(description = "페이지 크기", example = "20") @RequestParam(defaultValue = "20")
|
||||
int size) {
|
||||
HyperParamDto.SearchReq searchReq = new HyperParamDto.SearchReq();
|
||||
searchReq.setType(type);
|
||||
searchReq.setStartDate(startDate);
|
||||
searchReq.setEndDate(endDate);
|
||||
searchReq.setHyperVer(hyperVer);
|
||||
searchReq.setSort(sort);
|
||||
searchReq.setPage(page);
|
||||
searchReq.setSize(size);
|
||||
Page<List> list = hyperClsParamService.getHyperParamList(model, searchReq);
|
||||
|
||||
return ApiResponseDto.ok(list);
|
||||
}
|
||||
|
||||
@Operation(summary = "하이퍼파라미터 삭제", description = "하이퍼파라미터 삭제")
|
||||
@ApiResponses(
|
||||
value = {
|
||||
@ApiResponse(responseCode = "200", description = "삭제 성공", content = @Content),
|
||||
@ApiResponse(responseCode = "422", description = "default 삭제 불가", content = @Content),
|
||||
@ApiResponse(responseCode = "404", description = "하이퍼파라미터를 찾을 수 없음", content = @Content),
|
||||
})
|
||||
@DeleteMapping("/{uuid}")
|
||||
public ApiResponseDto<Void> deleteHyperParam(
|
||||
@Parameter(description = "하이퍼파라미터 uuid", example = "57fc9170-64c1-4128-aa7b-0657f08d6d10")
|
||||
@PathVariable
|
||||
UUID uuid) {
|
||||
hyperClsParamService.deleteHyperParam(uuid);
|
||||
return ApiResponseDto.ok(null);
|
||||
}
|
||||
|
||||
@Operation(summary = "하이퍼파라미터 상세 조회", description = "특정 버전의 하이퍼파라미터 상세 정보를 조회합니다")
|
||||
@ApiResponses(
|
||||
value = {
|
||||
@ApiResponse(
|
||||
responseCode = "200",
|
||||
description = "조회 성공",
|
||||
content =
|
||||
@Content(
|
||||
mediaType = "application/json",
|
||||
schema = @Schema(implementation = HyperParamDto.Basic.class))),
|
||||
@ApiResponse(responseCode = "404", description = "하이퍼파라미터를 찾을 수 없음", content = @Content),
|
||||
@ApiResponse(responseCode = "500", description = "서버 오류", content = @Content)
|
||||
})
|
||||
@GetMapping("/{uuid}")
|
||||
public ApiResponseDto<HyperClsParamDto.Basic> getHyperParam(
|
||||
@Parameter(description = "하이퍼파라미터 uuid", example = "57fc9170-64c1-4128-aa7b-0657f08d6d10")
|
||||
@PathVariable
|
||||
UUID uuid) {
|
||||
return ApiResponseDto.ok(hyperClsParamService.getHyperParam(uuid));
|
||||
}
|
||||
|
||||
@Operation(summary = "하이퍼파라미터 최적화 값 조회", description = "하이퍼파라미터 최적화 값 조회 API")
|
||||
@ApiResponses(
|
||||
value = {
|
||||
@ApiResponse(
|
||||
responseCode = "200",
|
||||
description = "조회 성공",
|
||||
content =
|
||||
@Content(
|
||||
mediaType = "application/json",
|
||||
schema = @Schema(implementation = Page.class))),
|
||||
@ApiResponse(responseCode = "404", description = "하이퍼파라미터를 찾을 수 없음", content = @Content),
|
||||
@ApiResponse(responseCode = "500", description = "서버 오류", content = @Content)
|
||||
})
|
||||
@GetMapping("/init/{model}")
|
||||
public ApiResponseDto<HyperClsParamDto.Basic> getInitHyperParam(@PathVariable ModelType model) {
|
||||
|
||||
return ApiResponseDto.ok(hyperClsParamService.getInitHyperParam(model));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,128 @@
|
||||
package com.kamco.cd.training.hyperparam.dto;
|
||||
|
||||
import com.kamco.cd.training.common.enums.ModelType;
|
||||
import com.kamco.cd.training.common.utils.enums.CodeExpose;
|
||||
import com.kamco.cd.training.common.utils.enums.EnumType;
|
||||
import com.kamco.cd.training.common.utils.interfaces.JsonFormatDttm;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import java.time.LocalDate;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.util.UUID;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import org.springframework.data.domain.PageRequest;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.data.domain.Sort;
|
||||
|
||||
public class HyperClsParamDto {
|
||||
|
||||
@Schema(name = "Basic", description = "하이퍼파라미터 조회")
|
||||
@Getter
|
||||
@Setter
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class Basic {
|
||||
|
||||
private ModelType model; // 20250212 modeltype추가
|
||||
private UUID uuid;
|
||||
private String hyperVer;
|
||||
@JsonFormatDttm private ZonedDateTime createdDttm;
|
||||
@JsonFormatDttm private ZonedDateTime lastUsedDttm;
|
||||
private Integer totalUseCnt;
|
||||
|
||||
// -------------------------
|
||||
// Model
|
||||
// -------------------------
|
||||
private String inputSize;
|
||||
private Integer batchSize;
|
||||
private Integer workers;
|
||||
|
||||
// -------------------------
|
||||
// Augmentation
|
||||
// -------------------------
|
||||
private Double scale;
|
||||
private Double translate;
|
||||
private Double fliplr;
|
||||
private Double flipud;
|
||||
private Double erasing;
|
||||
private Double mixup;
|
||||
private Double hsvH;
|
||||
private Double hsvS;
|
||||
private Double hsvV;
|
||||
private Double dropout;
|
||||
private Double labelSmoothing;
|
||||
|
||||
// -------------------------
|
||||
// Memo
|
||||
// -------------------------
|
||||
private String memo;
|
||||
|
||||
// -------------------------
|
||||
// Hardware
|
||||
// -------------------------
|
||||
private Boolean isDefault;
|
||||
}
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class List {
|
||||
private UUID uuid;
|
||||
private ModelType model;
|
||||
private String hyperVer;
|
||||
@JsonFormatDttm private ZonedDateTime createDttm;
|
||||
@JsonFormatDttm private ZonedDateTime lastUsedDttm;
|
||||
private String memo;
|
||||
private Integer totalUseCnt;
|
||||
}
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class SearchReq {
|
||||
private String type;
|
||||
private LocalDate startDate;
|
||||
private LocalDate endDate;
|
||||
private String hyperVer;
|
||||
|
||||
// 페이징 파라미터
|
||||
private int page = 0;
|
||||
private int size = 20;
|
||||
private String sort;
|
||||
|
||||
public Pageable toPageable() {
|
||||
if (sort != null && !sort.isEmpty()) {
|
||||
String[] sortParams = sort.split(",");
|
||||
String property = sortParams[0];
|
||||
Sort.Direction direction =
|
||||
sortParams.length > 1 ? Sort.Direction.fromString(sortParams[1]) : Sort.Direction.ASC;
|
||||
return PageRequest.of(page, size, Sort.by(direction, property));
|
||||
}
|
||||
return PageRequest.of(page, size);
|
||||
}
|
||||
}
|
||||
|
||||
@CodeExpose
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum HyperType implements EnumType {
|
||||
CREATE_DATE("생성일"),
|
||||
LAST_USED_DATE("최근 사용일");
|
||||
|
||||
private final String desc;
|
||||
|
||||
@Override
|
||||
public String getId() {
|
||||
return name();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getText() {
|
||||
return desc;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
package com.kamco.cd.training.hyperparam.service;
|
||||
|
||||
import com.kamco.cd.training.common.dto.HyperClsParam;
|
||||
import com.kamco.cd.training.common.enums.ModelType;
|
||||
import com.kamco.cd.training.hyperparam.dto.HyperClsParamDto;
|
||||
import com.kamco.cd.training.hyperparam.dto.HyperParamDto.List;
|
||||
import com.kamco.cd.training.hyperparam.dto.HyperParamDto.SearchReq;
|
||||
import com.kamco.cd.training.postgres.core.HyperClsParamCoreService;
|
||||
import java.util.UUID;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
@Service
|
||||
@Transactional(readOnly = true)
|
||||
@RequiredArgsConstructor
|
||||
public class HyperClsParamService {
|
||||
|
||||
private final HyperClsParamCoreService hyperClsParamCoreService;
|
||||
|
||||
/**
|
||||
* 하이퍼 파라미터 목록 조회
|
||||
*
|
||||
* @param model
|
||||
* @param req
|
||||
* @return 목록
|
||||
*/
|
||||
public Page<List> getHyperParamList(ModelType model, SearchReq req) {
|
||||
return hyperClsParamCoreService.findByHyperVerList(model, req);
|
||||
}
|
||||
|
||||
/**
|
||||
* 하이퍼파라미터 등록
|
||||
*
|
||||
* @param createReq 등록 요청
|
||||
* @return 생성된 버전명
|
||||
*/
|
||||
@Transactional
|
||||
public String createHyperParam(HyperClsParam createReq) {
|
||||
return hyperClsParamCoreService.createHyperParam(createReq).getHyperVer();
|
||||
}
|
||||
|
||||
/**
|
||||
* 하이퍼파라미터 수정
|
||||
*
|
||||
* @param createReq
|
||||
* @return
|
||||
*/
|
||||
@Transactional
|
||||
public String updateHyperParam(UUID uuid, HyperClsParam createReq) {
|
||||
return hyperClsParamCoreService.updateHyperParam(uuid, createReq);
|
||||
}
|
||||
|
||||
/**
|
||||
* 하이퍼파라미터 삭제
|
||||
*
|
||||
* @param uuid
|
||||
*/
|
||||
public void deleteHyperParam(UUID uuid) {
|
||||
hyperClsParamCoreService.deleteHyperParam(uuid);
|
||||
}
|
||||
|
||||
/** 하이퍼파라미터 최적화 설정값 조회 */
|
||||
public HyperClsParamDto.Basic getInitHyperParam(ModelType model) {
|
||||
return hyperClsParamCoreService.getInitHyperParam(model);
|
||||
}
|
||||
|
||||
/**
|
||||
* 하이퍼파라미터 상세 조회
|
||||
*
|
||||
* @param uuid
|
||||
* @return
|
||||
*/
|
||||
public HyperClsParamDto.Basic getHyperParam(UUID uuid) {
|
||||
return hyperClsParamCoreService.getHyperParam(uuid);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,189 @@
|
||||
package com.kamco.cd.training.postgres.core;
|
||||
|
||||
import com.kamco.cd.training.common.dto.HyperClsParam;
|
||||
import com.kamco.cd.training.common.enums.ModelType;
|
||||
import com.kamco.cd.training.common.exception.CustomApiException;
|
||||
import com.kamco.cd.training.common.utils.UserUtil;
|
||||
import com.kamco.cd.training.hyperparam.dto.HyperClsParamDto;
|
||||
import com.kamco.cd.training.hyperparam.dto.HyperParamDto;
|
||||
import com.kamco.cd.training.hyperparam.dto.HyperParamDto.SearchReq;
|
||||
import com.kamco.cd.training.postgres.entity.ModelHyperClsParamEntity;
|
||||
import com.kamco.cd.training.postgres.repository.hyperparam.HyperClsParamRepository;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.util.UUID;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class HyperClsParamCoreService {
|
||||
|
||||
private final HyperClsParamRepository hyperClsParamRepository;
|
||||
private final UserUtil userUtil;
|
||||
|
||||
/**
|
||||
* 하이퍼파라미터 등록
|
||||
*
|
||||
* @param createReq ModelTrainMngDto.HyperParamDto
|
||||
* @return 등록된 버전명
|
||||
*/
|
||||
public HyperClsParamDto.Basic createHyperParam(HyperClsParam createReq) {
|
||||
String firstVersion = getFirstHyperParamVersion(createReq.getModel());
|
||||
|
||||
ModelHyperClsParamEntity entity = new ModelHyperClsParamEntity();
|
||||
entity.setHyperVer(firstVersion);
|
||||
applyHyperParam(entity, createReq);
|
||||
|
||||
// user
|
||||
entity.setCreatedUid(userUtil.getId());
|
||||
|
||||
ModelHyperClsParamEntity resultEntity = hyperClsParamRepository.save(entity);
|
||||
HyperClsParamDto.Basic basic = new HyperClsParamDto.Basic();
|
||||
basic.setUuid(resultEntity.getUuid());
|
||||
basic.setHyperVer(resultEntity.getHyperVer());
|
||||
return basic;
|
||||
}
|
||||
|
||||
/**
|
||||
* 하이퍼파라미터 수정
|
||||
*
|
||||
* @param uuid uuid
|
||||
* @param createReq 등록 요청
|
||||
* @return ver
|
||||
*/
|
||||
public String updateHyperParam(UUID uuid, HyperClsParam createReq) {
|
||||
ModelHyperClsParamEntity entity =
|
||||
hyperClsParamRepository
|
||||
.findHyperParamByUuid(uuid)
|
||||
.orElseThrow(() -> new CustomApiException("NOT_FOUND_DATA", HttpStatus.NOT_FOUND));
|
||||
|
||||
if (entity.getIsDefault()) {
|
||||
throw new CustomApiException("UNPROCESSABLE_ENTITY_UPDATE", HttpStatus.UNPROCESSABLE_ENTITY);
|
||||
}
|
||||
applyHyperParam(entity, createReq);
|
||||
|
||||
// user
|
||||
entity.setUpdatedUid(userUtil.getId());
|
||||
entity.setUpdatedDttm(ZonedDateTime.now());
|
||||
|
||||
return entity.getHyperVer();
|
||||
}
|
||||
|
||||
/**
|
||||
* 하이퍼파라미터 삭제
|
||||
*
|
||||
* @param uuid
|
||||
*/
|
||||
public void deleteHyperParam(UUID uuid) {
|
||||
ModelHyperClsParamEntity entity =
|
||||
hyperClsParamRepository
|
||||
.findHyperParamByUuid(uuid)
|
||||
.orElseThrow(() -> new CustomApiException("NOT_FOUND_DATA", HttpStatus.NOT_FOUND));
|
||||
|
||||
// 디폴트면 삭제불가
|
||||
if (entity.getIsDefault()) {
|
||||
throw new CustomApiException("UNPROCESSABLE_ENTITY", HttpStatus.UNPROCESSABLE_ENTITY);
|
||||
}
|
||||
|
||||
entity.setDelYn(true);
|
||||
entity.setUpdatedUid(userUtil.getId());
|
||||
entity.setUpdatedDttm(ZonedDateTime.now());
|
||||
}
|
||||
|
||||
/**
|
||||
* 하이퍼파라미터 최적화 설정값 조회
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public HyperClsParamDto.Basic getInitHyperParam(ModelType model) {
|
||||
ModelHyperClsParamEntity entity =
|
||||
hyperClsParamRepository.getHyperParamByType(model).stream()
|
||||
.filter(e -> e.getIsDefault() == Boolean.TRUE)
|
||||
.findFirst()
|
||||
.orElseThrow(() -> new CustomApiException("NOT_FOUND_DATA", HttpStatus.NOT_FOUND));
|
||||
return entity.toDto();
|
||||
}
|
||||
|
||||
/**
|
||||
* 하이퍼파라미터 상세 조회
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public HyperClsParamDto.Basic getHyperParam(UUID uuid) {
|
||||
ModelHyperClsParamEntity entity =
|
||||
hyperClsParamRepository
|
||||
.findHyperParamByUuid(uuid)
|
||||
.orElseThrow(() -> new CustomApiException("NOT_FOUND_DATA", HttpStatus.NOT_FOUND));
|
||||
return entity.toDto();
|
||||
}
|
||||
|
||||
/**
|
||||
* 하이퍼파라미터 목록 조회
|
||||
*
|
||||
* @param model
|
||||
* @param req
|
||||
* @return
|
||||
*/
|
||||
public Page<HyperParamDto.List> findByHyperVerList(ModelType model, SearchReq req) {
|
||||
return hyperClsParamRepository.findByHyperVerList(model, req);
|
||||
}
|
||||
|
||||
/**
|
||||
* 하이퍼파라미터 버전 조회
|
||||
*
|
||||
* @param model 모델 타입
|
||||
* @return ver
|
||||
*/
|
||||
public String getFirstHyperParamVersion(ModelType model) {
|
||||
return hyperClsParamRepository
|
||||
.findHyperParamVerByModelType(model)
|
||||
.map(ModelHyperClsParamEntity::getHyperVer)
|
||||
.map(ver -> increase(ver, model))
|
||||
.orElse(model.name() + "_000001");
|
||||
}
|
||||
|
||||
/**
|
||||
* 하이퍼 파라미터의 버전을 증가시킨다.
|
||||
*
|
||||
* @param hyperVer 현재 버전
|
||||
* @param modelType 모델 타입
|
||||
* @return 증가된 버전
|
||||
*/
|
||||
private String increase(String hyperVer, ModelType modelType) {
|
||||
String prefix = modelType.name() + "_";
|
||||
int num = Integer.parseInt(hyperVer.substring(prefix.length()));
|
||||
return prefix + String.format("%06d", num + 1);
|
||||
}
|
||||
|
||||
private void applyHyperParam(ModelHyperClsParamEntity entity, HyperClsParam src) {
|
||||
|
||||
ModelType model = src.getModel();
|
||||
|
||||
entity.setInputSize(src.getInputSize());
|
||||
|
||||
// Model
|
||||
entity.setModelType(model);
|
||||
entity.setInputSize(src.getInputSize());
|
||||
entity.setBatchSize(src.getBatchSize());
|
||||
entity.setInputSize(src.getInputSize());
|
||||
|
||||
// Argument
|
||||
entity.setScale(src.getScale());
|
||||
entity.setTranslate(src.getTranslate());
|
||||
entity.setFliplr(src.getFliplr());
|
||||
entity.setFlipud(src.getFlipud());
|
||||
entity.setErasing(src.getErasing());
|
||||
entity.setMixup(src.getMixup());
|
||||
entity.setHsvH(src.getHsvH());
|
||||
entity.setHsvS(src.getHsvS());
|
||||
entity.setHsvV(src.getHsvV());
|
||||
entity.setDropout(src.getDropout());
|
||||
entity.setLabelSmoothing(src.getLabelSmoothing());
|
||||
|
||||
// memo
|
||||
entity.setMemo(src.getMemo());
|
||||
entity.setIsDefault(src.getIsDefault());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,177 @@
|
||||
package com.kamco.cd.training.postgres.entity;
|
||||
|
||||
import com.kamco.cd.training.common.enums.ModelType;
|
||||
import com.kamco.cd.training.hyperparam.dto.HyperClsParamDto;
|
||||
import jakarta.persistence.*;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import jakarta.validation.constraints.Size;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.util.UUID;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.hibernate.annotations.ColumnDefault;
|
||||
import org.hibernate.annotations.UuidGenerator;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@Entity
|
||||
@Table(
|
||||
name = "tb_model_cls_hyper_params",
|
||||
indexes = {@Index(name = "idx_hyper_cls_params_hyper_ver", columnList = "hyper_ver")})
|
||||
public class ModelHyperClsParamEntity {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
@Column(name = "hyper_param_id", nullable = false)
|
||||
private Long id;
|
||||
|
||||
@NotNull
|
||||
@UuidGenerator
|
||||
@Column(name = "uuid", nullable = false, updatable = false)
|
||||
private UUID uuid = UUID.randomUUID();
|
||||
|
||||
@Size(max = 50)
|
||||
@NotNull
|
||||
@Column(name = "hyper_ver", nullable = false, length = 50)
|
||||
private String hyperVer;
|
||||
|
||||
// -------------------------
|
||||
// Important (Default 반영)
|
||||
// -------------------------
|
||||
|
||||
/** Choices: 256,256 or 512,512. Default: 256,256 */
|
||||
@Size(max = 15)
|
||||
@NotNull
|
||||
@Column(name = "input_size", nullable = false, length = 15)
|
||||
private String inputSize = "256,256";
|
||||
|
||||
/** Range: >=1. Default: 16 (per GPU) */
|
||||
@NotNull
|
||||
@Column(name = "batch_size", nullable = false)
|
||||
private Integer batchSize = 16;
|
||||
|
||||
/** Range: >=1. Default: 16 */
|
||||
@NotNull
|
||||
@Column(name = "workers", nullable = false)
|
||||
private Integer workers = 16;
|
||||
|
||||
// -------------------------
|
||||
// Augmentation (Default 반영)
|
||||
// -------------------------
|
||||
|
||||
@Column(name = "scale")
|
||||
private Double scale = 0.5;
|
||||
|
||||
@Column(name = "translate")
|
||||
private Double translate = 0.1;
|
||||
|
||||
@Column(name = "fliplr")
|
||||
private Double fliplr = 0.5;
|
||||
|
||||
@Column(name = "flipud")
|
||||
private Double flipud = 0.5;
|
||||
|
||||
@Column(name = "erasing")
|
||||
private Double erasing;
|
||||
|
||||
@Column(name = "mixup")
|
||||
private Double mixup = 0.1;
|
||||
|
||||
@Column(name = "hsv_h")
|
||||
private Double hsvH;
|
||||
|
||||
@Column(name = "hsv_s")
|
||||
private Double hsvS;
|
||||
|
||||
@Column(name = "hsv_v")
|
||||
private Double hsvV;
|
||||
|
||||
@Column(name = "dropout")
|
||||
private Double dropout;
|
||||
|
||||
@Column(name = "label_smoothing")
|
||||
private Double labelSmoothing;
|
||||
|
||||
// -------------------------
|
||||
// Common
|
||||
// -------------------------
|
||||
|
||||
@Column(name = "memo")
|
||||
private String memo;
|
||||
|
||||
@NotNull
|
||||
@ColumnDefault("false")
|
||||
@Column(name = "del_yn", nullable = false, length = 1)
|
||||
private Boolean delYn = false;
|
||||
|
||||
@NotNull
|
||||
@ColumnDefault("CURRENT_TIMESTAMP")
|
||||
@Column(name = "created_dttm", nullable = false)
|
||||
private ZonedDateTime createdDttm = ZonedDateTime.now();
|
||||
|
||||
@NotNull
|
||||
@Column(name = "created_uid", nullable = false)
|
||||
private Long createdUid;
|
||||
|
||||
@ColumnDefault("CURRENT_TIMESTAMP")
|
||||
@Column(name = "updated_dttm")
|
||||
private ZonedDateTime updatedDttm;
|
||||
|
||||
@Column(name = "updated_uid")
|
||||
private Long updatedUid;
|
||||
|
||||
@ColumnDefault("CURRENT_TIMESTAMP")
|
||||
@Column(name = "last_used_dttm")
|
||||
private ZonedDateTime lastUsedDttm;
|
||||
|
||||
@Column(name = "model_type")
|
||||
@Enumerated(EnumType.STRING)
|
||||
private ModelType modelType;
|
||||
|
||||
@Column(name = "default_param")
|
||||
private Boolean isDefault = false;
|
||||
|
||||
@Column(name = "total_use_cnt")
|
||||
private Integer totalUseCnt = 0;
|
||||
|
||||
public HyperClsParamDto.Basic toDto() {
|
||||
return new HyperClsParamDto.Basic(
|
||||
this.modelType,
|
||||
this.uuid,
|
||||
this.hyperVer,
|
||||
this.createdDttm,
|
||||
this.lastUsedDttm,
|
||||
this.totalUseCnt,
|
||||
// -------------------------
|
||||
// Model
|
||||
// -------------------------
|
||||
this.inputSize,
|
||||
this.batchSize,
|
||||
this.workers,
|
||||
|
||||
// -------------------------
|
||||
// Argument
|
||||
// -------------------------
|
||||
this.scale,
|
||||
this.translate,
|
||||
this.fliplr,
|
||||
this.flipud,
|
||||
this.erasing,
|
||||
this.mixup,
|
||||
this.hsvH,
|
||||
this.hsvS,
|
||||
this.hsvV,
|
||||
this.dropout,
|
||||
this.labelSmoothing,
|
||||
|
||||
// -------------------------
|
||||
// Memo
|
||||
// -------------------------
|
||||
this.memo,
|
||||
|
||||
// -------------------------
|
||||
// Hardware
|
||||
// -------------------------
|
||||
this.isDefault);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package com.kamco.cd.training.postgres.repository.hyperparam;
|
||||
|
||||
import com.kamco.cd.training.postgres.entity.ModelHyperClsParamEntity;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
@Repository
|
||||
public interface HyperClsParamRepository
|
||||
extends JpaRepository<ModelHyperClsParamEntity, Long>, HyperClsParamRepositoryCustom {}
|
||||
@@ -0,0 +1,63 @@
|
||||
package com.kamco.cd.training.postgres.repository.hyperparam;
|
||||
|
||||
import com.kamco.cd.training.common.enums.ModelType;
|
||||
import com.kamco.cd.training.hyperparam.dto.HyperParamDto;
|
||||
import com.kamco.cd.training.hyperparam.dto.HyperParamDto.SearchReq;
|
||||
import com.kamco.cd.training.postgres.entity.ModelHyperClsParamEntity;
|
||||
import com.kamco.cd.training.postgres.entity.ModelHyperParamEntity;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
import org.springframework.data.domain.Page;
|
||||
|
||||
public interface HyperClsParamRepositoryCustom {
|
||||
|
||||
// TODO 미사용시작
|
||||
/**
|
||||
* 마지막 버전 조회
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Deprecated
|
||||
Optional<ModelHyperParamEntity> findHyperParamVer();
|
||||
|
||||
// TODO 미사용 끝
|
||||
|
||||
/**
|
||||
* 모델 타입별 마지막 버전 조회
|
||||
*
|
||||
* @param modelType 모델 타입
|
||||
* @return
|
||||
*/
|
||||
Optional<ModelHyperClsParamEntity> findHyperParamVerByModelType(ModelType modelType);
|
||||
|
||||
// TODO 미사용시작
|
||||
Optional<ModelHyperParamEntity> findHyperParamByHyperVer(String hyperVer);
|
||||
|
||||
// TODO 미사용 끝
|
||||
|
||||
/**
|
||||
* 하이퍼 파라미터 상세조회
|
||||
*
|
||||
* @param uuid
|
||||
* @return
|
||||
*/
|
||||
Optional<ModelHyperClsParamEntity> findHyperParamByUuid(UUID uuid);
|
||||
|
||||
/**
|
||||
* 하이퍼 파라미터 목록 조회
|
||||
*
|
||||
* @param model
|
||||
* @param req
|
||||
* @return
|
||||
*/
|
||||
Page<HyperParamDto.List> findByHyperVerList(ModelType model, SearchReq req);
|
||||
|
||||
/**
|
||||
* 하이퍼 파라미터 모델타입으로 조회
|
||||
*
|
||||
* @param modelType
|
||||
* @return
|
||||
*/
|
||||
List<ModelHyperClsParamEntity> getHyperParamByType(ModelType modelType);
|
||||
}
|
||||
@@ -0,0 +1,203 @@
|
||||
package com.kamco.cd.training.postgres.repository.hyperparam;
|
||||
|
||||
import static com.kamco.cd.training.postgres.entity.QModelHyperClsParamEntity.modelHyperClsParamEntity;
|
||||
import static com.kamco.cd.training.postgres.entity.QModelHyperParamEntity.modelHyperParamEntity;
|
||||
|
||||
import com.kamco.cd.training.common.enums.ModelType;
|
||||
import com.kamco.cd.training.hyperparam.dto.HyperParamDto;
|
||||
import com.kamco.cd.training.hyperparam.dto.HyperParamDto.HyperType;
|
||||
import com.kamco.cd.training.hyperparam.dto.HyperParamDto.SearchReq;
|
||||
import com.kamco.cd.training.postgres.entity.ModelHyperClsParamEntity;
|
||||
import com.kamco.cd.training.postgres.entity.ModelHyperParamEntity;
|
||||
import com.querydsl.core.BooleanBuilder;
|
||||
import com.querydsl.core.types.Projections;
|
||||
import com.querydsl.jpa.impl.JPAQuery;
|
||||
import com.querydsl.jpa.impl.JPAQueryFactory;
|
||||
import java.time.ZoneId;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.PageImpl;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.data.domain.Sort;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
@Repository
|
||||
@RequiredArgsConstructor
|
||||
public class HyperClsParamRepositoryImpl implements HyperClsParamRepositoryCustom {
|
||||
|
||||
private final JPAQueryFactory queryFactory;
|
||||
|
||||
// TODO 미사용시작
|
||||
@Override
|
||||
public Optional<ModelHyperParamEntity> findHyperParamVer() {
|
||||
|
||||
return Optional.ofNullable(
|
||||
queryFactory
|
||||
.select(modelHyperParamEntity)
|
||||
.from(modelHyperParamEntity)
|
||||
.where(modelHyperParamEntity.delYn.isFalse())
|
||||
.orderBy(modelHyperParamEntity.hyperVer.desc())
|
||||
.limit(1)
|
||||
.fetchOne());
|
||||
}
|
||||
|
||||
// TODO 미사용 끝
|
||||
|
||||
@Override
|
||||
public Optional<ModelHyperClsParamEntity> findHyperParamVerByModelType(ModelType modelType) {
|
||||
|
||||
return Optional.ofNullable(
|
||||
queryFactory
|
||||
.select(modelHyperClsParamEntity)
|
||||
.from(modelHyperClsParamEntity)
|
||||
.where(
|
||||
modelHyperClsParamEntity
|
||||
.delYn
|
||||
.isFalse()
|
||||
.and(modelHyperClsParamEntity.modelType.eq(modelType)))
|
||||
.orderBy(modelHyperClsParamEntity.hyperVer.desc())
|
||||
.limit(1)
|
||||
.fetchOne());
|
||||
}
|
||||
|
||||
// TODO 미사용시작
|
||||
@Override
|
||||
public Optional<ModelHyperParamEntity> findHyperParamByHyperVer(String hyperVer) {
|
||||
|
||||
return Optional.ofNullable(
|
||||
queryFactory
|
||||
.select(modelHyperParamEntity)
|
||||
.from(modelHyperParamEntity)
|
||||
.where(
|
||||
modelHyperParamEntity
|
||||
.delYn
|
||||
.isFalse()
|
||||
.and(modelHyperParamEntity.hyperVer.eq(hyperVer)))
|
||||
.limit(1)
|
||||
.fetchOne());
|
||||
}
|
||||
|
||||
// TODO 미사용 끝
|
||||
|
||||
@Override
|
||||
public Optional<ModelHyperClsParamEntity> findHyperParamByUuid(UUID uuid) {
|
||||
return Optional.ofNullable(
|
||||
queryFactory
|
||||
.select(modelHyperClsParamEntity)
|
||||
.from(modelHyperClsParamEntity)
|
||||
.where(modelHyperClsParamEntity.uuid.eq(uuid))
|
||||
.fetchOne());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Page<HyperParamDto.List> findByHyperVerList(ModelType model, SearchReq req) {
|
||||
Pageable pageable = req.toPageable();
|
||||
|
||||
BooleanBuilder builder = new BooleanBuilder();
|
||||
|
||||
builder.and(modelHyperClsParamEntity.delYn.isFalse());
|
||||
|
||||
if (model != null) {
|
||||
builder.and(modelHyperClsParamEntity.modelType.eq(model));
|
||||
}
|
||||
|
||||
if (req.getHyperVer() != null && !req.getHyperVer().isEmpty()) {
|
||||
// 버전
|
||||
builder.and(modelHyperClsParamEntity.hyperVer.contains(req.getHyperVer()));
|
||||
}
|
||||
|
||||
if (req.getStartDate() != null && req.getEndDate() != null) {
|
||||
|
||||
ZoneId zoneId = ZoneId.systemDefault();
|
||||
|
||||
ZonedDateTime start = req.getStartDate().atStartOfDay(zoneId);
|
||||
|
||||
ZonedDateTime end = req.getEndDate().atTime(23, 59, 59).atZone(zoneId);
|
||||
|
||||
if (HyperType.CREATE_DATE.getId().equals(req.getType())) {
|
||||
// 생성일
|
||||
builder.and(modelHyperClsParamEntity.createdDttm.between(start, end));
|
||||
} else if (HyperType.LAST_USED_DATE.getId().equals(req.getType())) {
|
||||
// 최종 사용일
|
||||
builder.and(modelHyperClsParamEntity.lastUsedDttm.between(start, end));
|
||||
}
|
||||
}
|
||||
|
||||
JPAQuery<HyperParamDto.List> query =
|
||||
queryFactory
|
||||
.select(
|
||||
Projections.constructor(
|
||||
HyperParamDto.List.class,
|
||||
modelHyperClsParamEntity.uuid,
|
||||
modelHyperClsParamEntity.modelType.as("model"),
|
||||
modelHyperClsParamEntity.hyperVer,
|
||||
modelHyperClsParamEntity.createdDttm,
|
||||
modelHyperClsParamEntity.lastUsedDttm,
|
||||
modelHyperClsParamEntity.memo,
|
||||
modelHyperClsParamEntity.totalUseCnt))
|
||||
.from(modelHyperClsParamEntity)
|
||||
.where(builder);
|
||||
|
||||
Sort.Order sortOrder = pageable.getSort().stream().findFirst().orElse(null);
|
||||
|
||||
if (sortOrder == null) {
|
||||
// 기본값
|
||||
query.orderBy(modelHyperClsParamEntity.createdDttm.desc());
|
||||
} else {
|
||||
String property = sortOrder.getProperty();
|
||||
boolean asc = sortOrder.isAscending();
|
||||
|
||||
switch (property) {
|
||||
case "createdDttm" ->
|
||||
query.orderBy(
|
||||
asc
|
||||
? modelHyperClsParamEntity.createdDttm.asc()
|
||||
: modelHyperClsParamEntity.createdDttm.desc());
|
||||
|
||||
case "lastUsedDttm" ->
|
||||
query.orderBy(
|
||||
asc
|
||||
? modelHyperClsParamEntity.lastUsedDttm.asc()
|
||||
: modelHyperClsParamEntity.lastUsedDttm.desc());
|
||||
case "totalUseCnt" ->
|
||||
query.orderBy(
|
||||
asc
|
||||
? modelHyperClsParamEntity.totalUseCnt.asc()
|
||||
: modelHyperClsParamEntity.totalUseCnt.desc());
|
||||
|
||||
default -> query.orderBy(modelHyperClsParamEntity.createdDttm.desc());
|
||||
}
|
||||
}
|
||||
|
||||
List<HyperParamDto.List> content =
|
||||
query.offset(pageable.getOffset()).limit(pageable.getPageSize()).fetch();
|
||||
|
||||
Long total =
|
||||
queryFactory
|
||||
.select(modelHyperClsParamEntity.count())
|
||||
.from(modelHyperClsParamEntity)
|
||||
.where(builder)
|
||||
.fetchOne();
|
||||
|
||||
long totalCount = (total != null) ? total : 0L;
|
||||
|
||||
return new PageImpl<>(content, pageable, totalCount);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ModelHyperClsParamEntity> getHyperParamByType(ModelType modelType) {
|
||||
return queryFactory
|
||||
.select(modelHyperClsParamEntity)
|
||||
.from(modelHyperClsParamEntity)
|
||||
.where(
|
||||
modelHyperClsParamEntity
|
||||
.delYn
|
||||
.isFalse()
|
||||
.and(modelHyperClsParamEntity.modelType.eq(modelType)))
|
||||
.fetch();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user