Compare commits
6 Commits
4f763d3c2e
...
feat/train
| Author | SHA1 | Date | |
|---|---|---|---|
| 265813e6f7 | |||
| 8190a6e9c8 | |||
| e9f8bb37fa | |||
| f3c822587f | |||
| 335f0dbb9b | |||
| 69eaba1a83 |
@@ -3,7 +3,6 @@ package com.kamco.cd.training.common.utils;
|
|||||||
import static java.lang.String.CASE_INSENSITIVE_ORDER;
|
import static java.lang.String.CASE_INSENSITIVE_ORDER;
|
||||||
|
|
||||||
import com.jcraft.jsch.ChannelExec;
|
import com.jcraft.jsch.ChannelExec;
|
||||||
import com.jcraft.jsch.ChannelSftp;
|
|
||||||
import com.jcraft.jsch.JSch;
|
import com.jcraft.jsch.JSch;
|
||||||
import com.jcraft.jsch.Session;
|
import com.jcraft.jsch.Session;
|
||||||
import com.kamco.cd.training.common.exception.CustomApiException;
|
import com.kamco.cd.training.common.exception.CustomApiException;
|
||||||
@@ -720,18 +719,26 @@ public class FIleChecker {
|
|||||||
public static void unzip(String fileName, String destDirectory) throws IOException {
|
public static void unzip(String fileName, String destDirectory) throws IOException {
|
||||||
String zipFilePath = destDirectory + File.separator + fileName;
|
String zipFilePath = destDirectory + File.separator + fileName;
|
||||||
|
|
||||||
|
log.info("fileName : {}", fileName);
|
||||||
|
log.info("destDirectory : {}", destDirectory);
|
||||||
|
log.info("zipFilePath : {}", zipFilePath);
|
||||||
// zip 이름으로 폴더 생성 (확장자 제거)
|
// zip 이름으로 폴더 생성 (확장자 제거)
|
||||||
String folderName =
|
String folderName =
|
||||||
fileName.endsWith(".zip") ? fileName.substring(0, fileName.length() - 4) : fileName;
|
fileName.endsWith(".zip") ? fileName.substring(0, fileName.length() - 4) : fileName;
|
||||||
|
log.info("folderName : {}", folderName);
|
||||||
|
|
||||||
File destDir = new File(destDirectory, folderName);
|
File destDir = new File(destDirectory, folderName);
|
||||||
|
log.info("destDir : {}", destDir);
|
||||||
|
|
||||||
// 동일 폴더가 이미 있으면 삭제
|
// 동일 폴더가 이미 있으면 삭제
|
||||||
|
log.info("111 destDir.exists() : {}", destDir.exists());
|
||||||
if (destDir.exists()) {
|
if (destDir.exists()) {
|
||||||
deleteDirectoryRecursively(destDir.toPath());
|
deleteDirectoryRecursively(destDir.toPath());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.info("222 destDir.exists() : {}", destDir.exists());
|
||||||
if (!destDir.exists()) {
|
if (!destDir.exists()) {
|
||||||
|
log.info("mkdirs : {}", destDir.exists());
|
||||||
destDir.mkdirs();
|
destDir.mkdirs();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -787,92 +794,6 @@ public class FIleChecker {
|
|||||||
return destFile;
|
return destFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void uploadTo86(Path localFile) {
|
|
||||||
|
|
||||||
String host = "192.168.2.86";
|
|
||||||
int port = 22;
|
|
||||||
String username = "kcomu";
|
|
||||||
String password = "Kamco2025!";
|
|
||||||
|
|
||||||
String remoteDir = "/home/kcomu/data/request";
|
|
||||||
|
|
||||||
Session session = null;
|
|
||||||
ChannelSftp channel = null;
|
|
||||||
|
|
||||||
try {
|
|
||||||
JSch jsch = new JSch();
|
|
||||||
|
|
||||||
session = jsch.getSession(username, host, port);
|
|
||||||
session.setPassword(password);
|
|
||||||
|
|
||||||
Properties config = new Properties();
|
|
||||||
config.put("StrictHostKeyChecking", "no");
|
|
||||||
session.setConfig(config);
|
|
||||||
|
|
||||||
session.connect(10_000);
|
|
||||||
|
|
||||||
channel = (ChannelSftp) session.openChannel("sftp");
|
|
||||||
channel.connect(10_000);
|
|
||||||
|
|
||||||
// 목적지 디렉토리 이동
|
|
||||||
channel.cd(remoteDir);
|
|
||||||
|
|
||||||
// 업로드
|
|
||||||
channel.put(localFile.toString(), localFile.getFileName().toString());
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
throw new RuntimeException("SFTP upload failed", e);
|
|
||||||
} finally {
|
|
||||||
if (channel != null) channel.disconnect();
|
|
||||||
if (session != null) session.disconnect();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void unzipOn86Server(String zipPath, String targetDir) {
|
|
||||||
|
|
||||||
String host = "192.168.2.86";
|
|
||||||
String user = "kcomu";
|
|
||||||
String password = "Kamco2025!";
|
|
||||||
|
|
||||||
Session session = null;
|
|
||||||
ChannelExec channel = null;
|
|
||||||
|
|
||||||
try {
|
|
||||||
JSch jsch = new JSch();
|
|
||||||
|
|
||||||
session = jsch.getSession(user, host, 22);
|
|
||||||
session.setPassword(password);
|
|
||||||
|
|
||||||
Properties config = new Properties();
|
|
||||||
config.put("StrictHostKeyChecking", "no");
|
|
||||||
session.setConfig(config);
|
|
||||||
|
|
||||||
session.connect(10_000);
|
|
||||||
|
|
||||||
String command = "unzip -o " + zipPath + " -d " + targetDir;
|
|
||||||
|
|
||||||
channel = (ChannelExec) session.openChannel("exec");
|
|
||||||
channel.setCommand(command);
|
|
||||||
channel.setErrStream(System.err);
|
|
||||||
|
|
||||||
InputStream in = channel.getInputStream();
|
|
||||||
channel.connect();
|
|
||||||
|
|
||||||
// 출력 읽기(선택)
|
|
||||||
try (BufferedReader br = new BufferedReader(new InputStreamReader(in))) {
|
|
||||||
while (br.readLine() != null) {
|
|
||||||
// 필요하면 로그
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
} finally {
|
|
||||||
if (channel != null) channel.disconnect();
|
|
||||||
if (session != null) session.disconnect();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static List<String> execCommandAndReadLines(String command) {
|
public static List<String> execCommandAndReadLines(String command) {
|
||||||
|
|
||||||
List<String> result = new ArrayList<>();
|
List<String> result = new ArrayList<>();
|
||||||
|
|||||||
@@ -417,6 +417,7 @@ public class DatasetService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private String escape(String path) {
|
private String escape(String path) {
|
||||||
|
// 쉘 커맨드에서 안전하게 사용할 수 있도록 문자열을 작은따옴표로 감싸면서, 내부의 작은따옴표를 이스케이프 처리
|
||||||
return "'" + path.replace("'", "'\"'\"'") + "'";
|
return "'" + path.replace("'", "'\"'\"'") + "'";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,9 +20,7 @@ import java.util.stream.Stream;
|
|||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.log4j.Log4j2;
|
import lombok.extern.log4j.Log4j2;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.boot.context.event.ApplicationReadyEvent;
|
|
||||||
import org.springframework.context.annotation.Profile;
|
import org.springframework.context.annotation.Profile;
|
||||||
import org.springframework.context.event.EventListener;
|
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
@@ -58,7 +56,7 @@ public class JobRecoveryOnStartupService {
|
|||||||
* <p>@Transactional: - recover() 메서드 전체가 하나의 트랜잭션으로 감싸집니다. - Job 하나씩 처리하다가 예외가 발생하면 전체 롤백이 될 수
|
* <p>@Transactional: - recover() 메서드 전체가 하나의 트랜잭션으로 감싸집니다. - Job 하나씩 처리하다가 예외가 발생하면 전체 롤백이 될 수
|
||||||
* 있으므로 "잡 단위로 확실히 커밋"이 필요하면 (권장) 잡 단위로 분리 트랜잭션(REQUIRES_NEW) 고려하세요.
|
* 있으므로 "잡 단위로 확실히 커밋"이 필요하면 (권장) 잡 단위로 분리 트랜잭션(REQUIRES_NEW) 고려하세요.
|
||||||
*/
|
*/
|
||||||
// @EventListener(ApplicationReadyEvent.class)
|
// @EventListener(ApplicationReadyEvent.class)
|
||||||
@Transactional
|
@Transactional
|
||||||
public void recover() {
|
public void recover() {
|
||||||
|
|
||||||
|
|||||||
@@ -20,71 +20,187 @@ public class TmpDatasetService {
|
|||||||
@Value("${train.docker.basePath}")
|
@Value("${train.docker.basePath}")
|
||||||
private String trainBaseDir;
|
private String trainBaseDir;
|
||||||
|
|
||||||
private final DataSetCountersService dataSetCountersService;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 다른 데이터셋 파일과 이름이 겹치면 그 파일은 skip함
|
* train, val, test 폴더별로 link
|
||||||
*
|
*
|
||||||
* @param uid
|
* @param uid 임시폴더 uuid
|
||||||
* @param type
|
* @param type train, val, test
|
||||||
* @param links
|
* @param links tif pull path
|
||||||
* @return
|
* @return
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
public String buildTmpDatasetSymlink(String uid, String type, List<ModelTrainLinkDto> links)
|
public void buildTmpDatasetHardlink(String uid, String type, List<ModelTrainLinkDto> links)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
|
|
||||||
if (uid == null || uid.isBlank()) throw new IOException("uid is empty");
|
if (links == null || links.isEmpty()) {
|
||||||
if (type == null || type.isBlank()) throw new IOException("type is empty");
|
throw new IOException("links is empty");
|
||||||
if (links == null || links.isEmpty()) throw new IOException("links is empty");
|
}
|
||||||
|
|
||||||
log.info("========== buildTmpDatasetHardlink MERGE START ==========");
|
Path tmp = Path.of(trainBaseDir, "tmp", uid);
|
||||||
log.info("uid={}, type={}, links.size={}", uid, type, links.size());
|
|
||||||
|
long hardlinksMade = 0;
|
||||||
|
|
||||||
|
for (ModelTrainLinkDto dto : links) {
|
||||||
|
|
||||||
|
if (type == null) {
|
||||||
|
log.warn("SKIP - trainType null: {}", dto);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// type별 디렉토리 생성
|
||||||
|
Files.createDirectories(tmp.resolve(type).resolve("input1"));
|
||||||
|
Files.createDirectories(tmp.resolve(type).resolve("input2"));
|
||||||
|
Files.createDirectories(tmp.resolve(type).resolve("label"));
|
||||||
|
Files.createDirectories(tmp.resolve(type).resolve("label-json"));
|
||||||
|
|
||||||
|
// comparePath → input1
|
||||||
|
hardlinksMade += link(tmp, type, "input1", dto.getComparePath());
|
||||||
|
|
||||||
|
// targetPath → input2
|
||||||
|
hardlinksMade += link(tmp, type, "input2", dto.getTargetPath());
|
||||||
|
|
||||||
|
// labelPath → label
|
||||||
|
hardlinksMade += link(tmp, type, "label", dto.getLabelPath());
|
||||||
|
|
||||||
|
// geoJsonPath -> label-json
|
||||||
|
hardlinksMade += link(tmp, type, "label-json", dto.getGeoJsonPath());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hardlinksMade == 0) {
|
||||||
|
throw new IOException("No hardlinks created.");
|
||||||
|
}
|
||||||
|
|
||||||
|
log.info("tmp dataset created: {}, hardlinksMade={}", tmp, hardlinksMade);
|
||||||
|
}
|
||||||
|
|
||||||
|
private long link(Path tmp, String type, String part, String fullPath) throws IOException {
|
||||||
|
|
||||||
|
if (fullPath == null || fullPath.isBlank()) return 0;
|
||||||
|
|
||||||
|
Path src = Path.of(fullPath);
|
||||||
|
|
||||||
|
if (!Files.isRegularFile(src)) {
|
||||||
|
log.warn("SKIP (not file): {}", src);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
String fileName = src.getFileName().toString();
|
||||||
|
Path dst = tmp.resolve(type).resolve(part).resolve(fileName);
|
||||||
|
|
||||||
|
// 충돌 시 덮어쓰기
|
||||||
|
if (Files.exists(dst)) {
|
||||||
|
Files.delete(dst);
|
||||||
|
}
|
||||||
|
|
||||||
|
Files.createLink(dst, src);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String safe(String s) {
|
||||||
|
return (s == null || s.isBlank()) ? null : s.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* request 전체 폴더 link
|
||||||
|
*
|
||||||
|
* @param uid
|
||||||
|
* @param datasetUids
|
||||||
|
* @return
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public String buildTmpDatasetSymlink(String uid, List<String> datasetUids) throws IOException {
|
||||||
|
|
||||||
|
log.info("========== buildTmpDatasetHardlink START ==========");
|
||||||
|
log.info("uid={}", uid);
|
||||||
|
log.info("datasetUids={}", datasetUids);
|
||||||
|
log.info("requestDir(raw)={}", requestDir);
|
||||||
|
|
||||||
Path BASE = toPath(requestDir);
|
Path BASE = toPath(requestDir);
|
||||||
Path tmp = Path.of(trainBaseDir, "tmp", uid);
|
Path tmp = Path.of(trainBaseDir, "tmp", uid);
|
||||||
|
|
||||||
long hardlinksMade = 0;
|
log.info("BASE={}", BASE);
|
||||||
long skippedCollision = 0;
|
log.info("BASE exists? {}", Files.isDirectory(BASE));
|
||||||
long noDir = 0;
|
log.info("tmp={}", tmp);
|
||||||
|
|
||||||
// tmp/<type>/<part> 준비
|
long noDir = 0, scannedDirs = 0, regularFiles = 0, hardlinksMade = 0;
|
||||||
|
|
||||||
|
// tmp 디렉토리 준비
|
||||||
|
for (String type : List.of("train", "val", "test")) {
|
||||||
for (String part : List.of("input1", "input2", "label", "label-json")) {
|
for (String part : List.of("input1", "input2", "label", "label-json")) {
|
||||||
Files.createDirectories(tmp.resolve(type).resolve(part));
|
Path dir = tmp.resolve(type).resolve(part);
|
||||||
|
Files.createDirectories(dir);
|
||||||
|
log.info("createDirectories: {}", dir);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (ModelTrainLinkDto dto : links) {
|
// 하드링크는 "같은 파일시스템"에서만 가능하므로 BASE/tmp가 같은 FS인지 미리 확인(권장)
|
||||||
String datasetUid = safe(dto.getDatasetUid());
|
try {
|
||||||
if (datasetUid == null) {
|
var baseStore = Files.getFileStore(BASE);
|
||||||
log.warn("SKIP dto (datasetUid null): {}", dto);
|
var tmpStore = Files.getFileStore(tmp.getParent()); // BASE/tmp
|
||||||
continue;
|
if (!baseStore.name().equals(tmpStore.name()) || !baseStore.type().equals(tmpStore.type())) {
|
||||||
|
throw new IOException(
|
||||||
|
"Hardlink requires same filesystem. baseStore="
|
||||||
|
+ baseStore.name()
|
||||||
|
+ "("
|
||||||
|
+ baseStore.type()
|
||||||
|
+ "), tmpStore="
|
||||||
|
+ tmpStore.name()
|
||||||
|
+ "("
|
||||||
|
+ tmpStore.type()
|
||||||
|
+ ")");
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
// FileStore 비교가 환경마다 애매할 수 있어서, 여기서는 경고만 주고 실제 createLink에서 최종 판단하게 둘 수도 있음.
|
||||||
|
log.warn("FileStore check skipped/failed (will rely on createLink): {}", e.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
Path srcRoot = BASE.resolve(datasetUid);
|
for (String id : datasetUids) {
|
||||||
|
Path srcRoot = BASE.resolve(id);
|
||||||
|
log.info("---- dataset id={} srcRoot={} exists? {}", id, srcRoot, Files.isDirectory(srcRoot));
|
||||||
|
|
||||||
|
for (String type : List.of("train", "val", "test")) {
|
||||||
for (String part : List.of("input1", "input2", "label", "label-json")) {
|
for (String part : List.of("input1", "input2", "label", "label-json")) {
|
||||||
|
|
||||||
Path srcDir = srcRoot.resolve(type).resolve(part);
|
Path srcDir = srcRoot.resolve(type).resolve(part);
|
||||||
if (!Files.isDirectory(srcDir)) {
|
if (!Files.isDirectory(srcDir)) {
|
||||||
|
log.warn("SKIP (not directory): {}", srcDir);
|
||||||
noDir++;
|
noDir++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 하위폴더까지 전부
|
scannedDirs++;
|
||||||
try (var walk = Files.walk(srcDir)) {
|
log.info("SCAN dir={}", srcDir);
|
||||||
for (Path f : walk.filter(Files::isRegularFile).toList()) {
|
|
||||||
|
|
||||||
String fileName = f.getFileName().toString();
|
try (DirectoryStream<Path> stream = Files.newDirectoryStream(srcDir)) {
|
||||||
Path dst = tmp.resolve(type).resolve(part).resolve(fileName);
|
for (Path f : stream) {
|
||||||
|
if (!Files.isRegularFile(f)) {
|
||||||
// 이름 유지 + 충돌은 skip
|
log.debug("skip non-regular file: {}", f);
|
||||||
if (Files.exists(dst)) {
|
|
||||||
skippedCollision++;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
regularFiles++;
|
||||||
|
|
||||||
|
String dstName = id + "__" + f.getFileName();
|
||||||
|
Path dst = tmp.resolve(type).resolve(part).resolve(dstName);
|
||||||
|
|
||||||
|
// dst가 남아있으면 삭제(심볼릭링크든 파일이든)
|
||||||
|
if (Files.exists(dst) || Files.isSymbolicLink(dst)) {
|
||||||
|
Files.delete(dst);
|
||||||
|
log.debug("deleted existing: {}", dst);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 하드링크 생성 (dst가 새 파일로 생기지만 inode는 f와 동일)
|
||||||
Files.createLink(dst, f);
|
Files.createLink(dst, f);
|
||||||
hardlinksMade++;
|
hardlinksMade++;
|
||||||
|
log.debug("created hardlink: {} => {}", dst, f);
|
||||||
|
} catch (IOException e) {
|
||||||
|
// 여기서 바로 실패시키면 “tmp는 만들었는데 내용은 0개” 같은 상태를 방지할 수 있음
|
||||||
|
log.error("FAILED create hardlink: {} => {}", dst, f, e);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -92,35 +208,29 @@ public class TmpDatasetService {
|
|||||||
|
|
||||||
if (hardlinksMade == 0) {
|
if (hardlinksMade == 0) {
|
||||||
throw new IOException(
|
throw new IOException(
|
||||||
"No hardlinks created. noDir=" + noDir + ", skippedCollision=" + skippedCollision);
|
"No hardlinks created. regularFiles="
|
||||||
|
+ regularFiles
|
||||||
|
+ ", scannedDirs="
|
||||||
|
+ scannedDirs
|
||||||
|
+ ", noDir="
|
||||||
|
+ noDir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.info("tmp dataset created: {}", tmp);
|
||||||
log.info(
|
log.info(
|
||||||
"tmp dataset merged: {} (type={}), hardlinksMade={}, skippedCollision={}, noDir={}",
|
"summary: scannedDirs={}, noDir={}, regularFiles={}, hardlinksMade={}",
|
||||||
tmp,
|
scannedDirs,
|
||||||
type,
|
noDir,
|
||||||
hardlinksMade,
|
regularFiles,
|
||||||
skippedCollision,
|
hardlinksMade);
|
||||||
noDir);
|
|
||||||
|
|
||||||
return uid;
|
return uid;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Path toPath(String p) {
|
private static Path toPath(String p) {
|
||||||
if (p == null || p.isBlank()) {
|
if (p.startsWith("~/")) {
|
||||||
throw new IllegalArgumentException("path is null or blank");
|
return Paths.get(System.getProperty("user.home")).resolve(p.substring(2)).normalize();
|
||||||
}
|
}
|
||||||
String trimmed = p.trim();
|
return Paths.get(p).toAbsolutePath().normalize();
|
||||||
if (trimmed.startsWith("~/")) {
|
|
||||||
return Paths.get(System.getProperty("user.home"))
|
|
||||||
.resolve(trimmed.substring(2))
|
|
||||||
.toAbsolutePath()
|
|
||||||
.normalize();
|
|
||||||
}
|
|
||||||
return Paths.get(trimmed).toAbsolutePath().normalize();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String safe(String s) {
|
|
||||||
return (s == null || s.isBlank()) ? null : s.trim();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -266,6 +266,8 @@ public class TrainJobService {
|
|||||||
List<String> uids = modelTrainMngCoreService.findDatasetUid(datasetIds);
|
List<String> uids = modelTrainMngCoreService.findDatasetUid(datasetIds);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
// 데이터셋 심볼링크 생성
|
||||||
|
// String pathUid = tmpDatasetService.buildTmpDatasetSymlink(raw, uids);
|
||||||
// train path
|
// train path
|
||||||
List<ModelTrainLinkDto> trainList = modelTrainMngCoreService.findDatasetTrainPath(modelId);
|
List<ModelTrainLinkDto> trainList = modelTrainMngCoreService.findDatasetTrainPath(modelId);
|
||||||
// validation path
|
// validation path
|
||||||
@@ -274,13 +276,12 @@ public class TrainJobService {
|
|||||||
List<ModelTrainLinkDto> testList = modelTrainMngCoreService.findDatasetTestPath(modelId);
|
List<ModelTrainLinkDto> testList = modelTrainMngCoreService.findDatasetTestPath(modelId);
|
||||||
|
|
||||||
// train 데이터셋 심볼링크 생성
|
// train 데이터셋 심볼링크 생성
|
||||||
tmpDatasetService.buildTmpDatasetSymlink(raw, "train", trainList);
|
tmpDatasetService.buildTmpDatasetHardlink(raw, "train", trainList);
|
||||||
// val 데이터셋 심볼링크 생성
|
// val 데이터셋 심볼링크 생성
|
||||||
tmpDatasetService.buildTmpDatasetSymlink(raw, "val", valList);
|
tmpDatasetService.buildTmpDatasetHardlink(raw, "val", valList);
|
||||||
// test 데이터셋 심볼링크 생성
|
// test 데이터셋 심볼링크 생성
|
||||||
tmpDatasetService.buildTmpDatasetSymlink(raw, "test", testList);
|
tmpDatasetService.buildTmpDatasetHardlink(raw, "test", testList);
|
||||||
// 카운트 로그
|
|
||||||
dataSetCounters.getCount(modelId);
|
|
||||||
ModelTrainMngDto.UpdateReq updateReq = new ModelTrainMngDto.UpdateReq();
|
ModelTrainMngDto.UpdateReq updateReq = new ModelTrainMngDto.UpdateReq();
|
||||||
updateReq.setRequestPath(raw);
|
updateReq.setRequestPath(raw);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user