From 703c25aadf6235bdbddde68dd6db044713e3dbc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dean=5B=EB=B0=B1=EB=B3=91=EB=82=A8=5D?= Date: Mon, 9 Feb 2026 20:26:38 +0900 Subject: [PATCH] Split the function --- .../libs/generator-dataset-for-training.jar | Bin 19808956 -> 19804708 bytes .../GeoJsonSchedulerApplication.java | 3 +- .../batch/ExportGeoJsonTasklet.java | 152 ------------------ .../src/main/resources/application-prod.yml | 17 ++ 4 files changed, 19 insertions(+), 153 deletions(-) delete mode 100644 kamco-make-dataset-generation/src/main/java/com/kamco/cd/geojsonscheduler/batch/ExportGeoJsonTasklet.java diff --git a/kamco-make-dataset-generation/build/libs/generator-dataset-for-training.jar b/kamco-make-dataset-generation/build/libs/generator-dataset-for-training.jar index cd0764b3c36c779ac6677888ab6744f265905670..1222b88f5d9eab84e995403a820a2507d65179b3 100644 GIT binary patch delta 4139 zcmY+{30O_(9|!Pz&bjUT?zRw0X*o%>P%48|Q*KgJwvrknsf@|mhAfSea0$Ikk+Gym zmrAy#(8$&wgQ&?)qz3<_|NOu2iHGq#pWpeuzxO>$=egZp)oV_v6g@hrqAB&~#QGv- zWo3~x!gsnXZG5&wmay-kSk_x@)lW=&Bq-XDk)+RFGn+XvoAtZTN+V>4@3SuS`1n5S zNsnPF5@nXl6}mXMQv5OOF-J?DzC2e!$M4$2kw!NF3#L57$vChyp_!g5?`CNZ|=86&x*n{^j@ zQ$Mjk(9_O+VwY;r;I7JjP@)$fsmsOC#%^6MQIDJ+qP>k%%_&*N-`+u~9_q{ESC z`pGL7aAJDdzL(Z_wdPHnT$A>;5pFKMWiR2>)oEi-73VD*vxifbPdUu_X?J9Ij<8>@E>u=Ppu#1{^>Qz_zvDCua{BfEgo*TEcIc!*cF4&@Zc54&Ao)wF(Q(G!dC;FFg&&Hu9|>OjSbpoKS17T*uLIQPJb zBl?tWklPJI3W+4)f6C0XjQa0RwmkiGep!yUVqFv49d^Z3SmiFWjcuE9{D{ZE zmZU{TQzj);}O{VXl=(W|j6?TEV=`n>j%Q)hQwZ0RIPbzsFNg{g^KQjw=czkVq&m7=;tYP}-J?)suv-dbnZj7>hP7CnR+K{!~DPvCU zfwW6IpUcfJn2xJYs;L_v;gYpth+0f$!15if*~@OF-h4T3l+&8}MDHm_UW6RKYZqgB zXMDJ=$)T4A560>_zw%Pb>ad;Hde0^@GVR^o-%1YtrH0q9{Qmc-hH$+7jqJbQzVCDq z{U_5o!}ZYLW6iVN7MA|f7M;xNIKc=Q3C`dGuHXivU^KXc2aEwv@B(ib3*W&w7!MP`2PT3q_<=us4*?JelRyeV zFd2ej3WPu?OoeF>2H_9^(_se8gjp~fA|VRqKs3yS7>I=*U>^Jk^C1ovKs+pj1W1G= zSOh=8V)z-7VF@gSWw0Dpz)DDgR7it#$beO_8rDE2tc7*39yUN0`~n*x8**S1ci|q~hh}&H51|EG;V)=|NAMV)z*Bez&*25UgjdiGui*`Jz+32qF8CYX z!F%`s|AlV&2tDu#df|WYPu80{CI@I?Y2j!Q)1p9&A}va^DAS@siz+Q@w5ZdfL5n6W zTC`}>qC<-=Eqb)*(_%o2AuUF<^rJ;Wi!m)Gw3yOjMoWKM2GC+o%RpKN(K4783tB8` z8A6K{E!MOQrNxF8TjmVDDj28fthDfq#bA5J=`u}W?e`sIXIyC_M z&Sf<0L|Cdr|A){$Ga@@(QzRn&MWP^LIhOc;b)*_TJ`_3ixBY4JMSp4l@WXo?Br!me)gvEL?zJ}8$ zqetT5=~MV3n6hmpUnkW`CVG0pn-V6U9{oD0MsB00O(&lVlPiyXom3}7@aZ(5lfuW8 z9e=!UlEkAgoRmgCzU+oC{W1*cC!bsq`WGw6O9VGgLC%ph7oIUB9;jZdNjphJkaDsv zjn5O$F!tb@@~mX)MOKz1z?EmL#r_4ZBJ$Q74?(ig@L;#BCRY&rxj2gnvQ3HG49GAy z+<+xB$b1B;I8GGQcZNh(qa7q6KJGlDN&dl{vDm#a;mch1g9J6=Jqq_=Nh6t$5GGa{ znf>Kv&1m>=(;~OgdkiJg(OAeu7$54p+dnBbocYhg!tOi)U1czX#9sXD1bs`3Qd8ryDHM7{fCX641sn zI%Ev8Ch5SOF?&@^)G-X_d~I~dB)k|Sl7{hUuIR1-*^9A0>3Cs)*Yy-#YnF8-I-c~k z=mZ%u#4pm28BErpVJ(i1GGb)8iQDwaMT}j=>F2+U8*dmfy26uLb9*d|KR-%5p46SS zd`u1_Ok#KKAiY8urbz;ETPZu^9NB|_Z>d6Z9l@0C)g^Bb#?X$#SlSuhOac%r%%z3C q(@#7Zd20ne(oLZE%}2Y4>3l$PvCK@fLDV3cHCZG&`p_P`(*Fa%k~6&k delta 8393 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 diff --git a/kamco-make-dataset-generation/src/main/java/com/kamco/cd/geojsonscheduler/GeoJsonSchedulerApplication.java b/kamco-make-dataset-generation/src/main/java/com/kamco/cd/geojsonscheduler/GeoJsonSchedulerApplication.java index 3165867..1e90fae 100644 --- a/kamco-make-dataset-generation/src/main/java/com/kamco/cd/geojsonscheduler/GeoJsonSchedulerApplication.java +++ b/kamco-make-dataset-generation/src/main/java/com/kamco/cd/geojsonscheduler/GeoJsonSchedulerApplication.java @@ -1,12 +1,13 @@ package com.kamco.cd.geojsonscheduler; import com.kamco.cd.geojsonscheduler.config.DockerProperties; +import com.kamco.cd.geojsonscheduler.config.TrainDockerProperties; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.EnableConfigurationProperties; @SpringBootApplication -@EnableConfigurationProperties(DockerProperties.class) +@EnableConfigurationProperties({DockerProperties.class, TrainDockerProperties.class}) public class GeoJsonSchedulerApplication { public static void main(String[] args) { diff --git a/kamco-make-dataset-generation/src/main/java/com/kamco/cd/geojsonscheduler/batch/ExportGeoJsonTasklet.java b/kamco-make-dataset-generation/src/main/java/com/kamco/cd/geojsonscheduler/batch/ExportGeoJsonTasklet.java deleted file mode 100644 index 2931dfe..0000000 --- a/kamco-make-dataset-generation/src/main/java/com/kamco/cd/geojsonscheduler/batch/ExportGeoJsonTasklet.java +++ /dev/null @@ -1,152 +0,0 @@ -package com.kamco.cd.geojsonscheduler.batch; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.kamco.cd.geojsonscheduler.dto.TrainingDataReviewJobDto.AnalCntInfo; -import com.kamco.cd.geojsonscheduler.dto.TrainingDataReviewJobDto.AnalMapSheetList; -import com.kamco.cd.geojsonscheduler.dto.TrainingDataReviewJobDto.CompleteLabelData; -import com.kamco.cd.geojsonscheduler.dto.TrainingDataReviewJobDto.CompleteLabelData.GeoJsonFeature; -import com.kamco.cd.geojsonscheduler.dto.TrainingDataReviewJobDto.FeatureCollection; -import com.kamco.cd.geojsonscheduler.repository.TrainingDataReviewJobRepository; -import com.kamco.cd.geojsonscheduler.service.DockerRunnerService; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.List; -import java.util.Objects; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; -import org.springframework.batch.core.StepContribution; -import org.springframework.batch.core.scope.context.ChunkContext; -import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -@Log4j2 -@Component -@RequiredArgsConstructor -public class ExportGeoJsonTasklet implements Tasklet { - - private final TrainingDataReviewJobRepository repository; - private final DockerRunnerService dockerRunnerService; - - @Value("${training-data.geojson-dir}") - private String trainingDataDir; - - @Override - public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) { - log.info("========================================"); - log.info("배치 작업 시작"); - log.info("========================================"); - - // 1. StepContext를 통해 바로 가져오기 (가장 추천) - String jobName = chunkContext.getStepContext().getJobName(); - log.info("Job Name: {}", jobName); - - // 진행중인 회차 중, complete_cnt 가 존재하는 회차 목록 가져오기 - log.info("진행중인 회차 목록 조회 중..."); - List analList = repository.findAnalCntInfoList(); - log.info("진행중인 회차 수: {}", analList.size()); - - int processedAnalCount = 0; - for (AnalCntInfo info : analList) { - log.info("----------------------------------------"); - log.info("회차 처리 중: AnalUid={}, ResultUid={}", info.getAnalUid(), info.getResultUid()); - log.info("전체 건수: {}, 파일 건수: {}", info.getAllCnt(), info.getFileCnt()); - - if (Objects.equals(info.getAllCnt(), info.getFileCnt())) { - log.info("모든 파일이 이미 처리됨. 건너뜀."); - continue; - } - - //추론 ID - String resultUid = info.getResultUid(); - log.info("ResultUid: {}", resultUid); - - //insert 하기 jobname, resultUid , 시작시간 - // 어제까지 검수 완료된 총 데이터의 도엽별 목록 가져오기 - log.info("검수 완료된 도엽 목록 조회 중... (AnalUid={})", info.getAnalUid()); - List analMapList = repository.findCompletedAnalMapSheetList(info.getAnalUid()); - log.info("검수 완료된 도엽 수: {}", analMapList.size()); - - //TODO 도엽이 4개이상 존재할때 만 RUN 하기 - if (analMapList.isEmpty()) { - log.warn("검수 완료된 도엽이 없음. 건너뜀."); - continue; - } - - //insert 하기 jobname, resultUid , 시작시간 - boolean anyProcessed = false; - int processedMapSheetCount = 0; - int totalGeoJsonFiles = 0; - - for (AnalMapSheetList mapSheet : analMapList) { - log.info(" 도엽 처리 중: MapSheetNum={}", mapSheet.getMapSheetNum()); - - //도엽별 geom 데이터 가지고 와서 geojson 만들기 - List completeList = - repository.findCompletedYesterdayLabelingList( - info.getAnalUid(), mapSheet.getMapSheetNum()); - log.info(" 완료된 라벨링 데이터 수: {}", completeList.size()); - - if (!completeList.isEmpty()) { - List geoUids = completeList.stream().map(CompleteLabelData::getGeoUid).toList(); - log.info(" GeoUID 목록 생성 완료: {} 건", geoUids.size()); - - List features = completeList.stream().map(GeoJsonFeature::from).toList(); - log.info(" GeoJSON Feature 변환 완료: {} 개", features.size()); - - FeatureCollection collection = new FeatureCollection(features); - String filename = mapSheet.buildFilename(resultUid); - log.info(" GeoJSON 파일명: {}", filename); - - // 형식 /kamco-nfs/dataset/request/uuid/filename - Path outputPath = Paths.get(trainingDataDir + File.separator + "request" + File.separator + resultUid, filename); - log.info(" 출력 경로: {}", outputPath); - - try { - Files.createDirectories(outputPath.getParent()); - log.info(" 디렉토리 생성 완료: {}", outputPath.getParent()); - - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.enable(SerializationFeature.INDENT_OUTPUT); - objectMapper.writeValue(outputPath.toFile(), collection); - log.info(" GeoJSON 파일 저장 완료: {}", outputPath); - - repository.updateLearnDataGeomFileCreateYn(geoUids); - log.info(" DB 업데이트 완료: {} 건", geoUids.size()); - - anyProcessed = true; - processedMapSheetCount++; - totalGeoJsonFiles++; - } catch (IOException e) { - log.error(" GeoJSON 파일 생성 실패: {}", e.getMessage(), e); - } - } - } - - log.info("회차 처리 완료: ResultUid={}", resultUid); - log.info(" 처리된 도엽 수: {}", processedMapSheetCount); - log.info(" 생성된 GeoJSON 파일 수: {}", totalGeoJsonFiles); - - if (anyProcessed) { - log.info("Docker 컨테이너 실행 중... (ResultUid={})", resultUid); - dockerRunnerService.run(resultUid); - log.info("Docker 컨테이너 실행 완료 (ResultUid={})", resultUid); - processedAnalCount++; - } else { - log.warn("처리된 도엽이 없어 Docker 실행 건너뜀 (ResultUid={})", resultUid); - } - } - - log.info("========================================"); - log.info("배치 작업 완료"); - log.info("처리된 회차 수: {}", processedAnalCount); - log.info("========================================"); - - return RepeatStatus.FINISHED; - } -} diff --git a/kamco-make-dataset-generation/src/main/resources/application-prod.yml b/kamco-make-dataset-generation/src/main/resources/application-prod.yml index 707a18c..9eae809 100644 --- a/kamco-make-dataset-generation/src/main/resources/application-prod.yml +++ b/kamco-make-dataset-generation/src/main/resources/application-prod.yml @@ -9,3 +9,20 @@ spring: training-data: geojson-dir: /kamco-nfs/dataset + +# Train Model Docker Configuration +train-data: + docker: + image: kamco-cd-train:latest + data-volume: /kamco-nfs/dataset:/data + checkpoints-volume: /kamco-nfs/checkpoints:/checkpoints + dataset-folder: /data/dataset + output-folder: /data/output + input-size: "512" + crop-size: "256" + batch-size: 8 + gpu-ids: "0,1,2,3" + gpus: 4 + lr: "0.001" + backbone: resnet50 + epochs: 100