카페인 중독자
Projects
microservice project
개발환경이슈
개요
example
week1
week2
Tutorial
Github tutorial
Templete tutorial
comment system
markdown guide
posting guide
visitor counter
cs-note
Abstract
쉬운코드
Web
개요
API
State
Transfer_Resource
dev-log
Home
tech-review
AI
BE
nginx
Communicate
Git
Contact
Copyright © 2024 |
Yankos
Home
>
Projects
>
microservice project
> week1
Now Loading ...
week1
결산
개요 1주차 주요 이슈 1. API Gateway가 각각의 서비스에 통신할 API 구조 정리 MSA를 구성하는 서비스를 아래의 분리 원칙을 참고하여 분리 및 API 통신 구조를 설계 1. 각 서비스는 하나의 역할만 수행해야 한다. Image -> mask를 만드는 기능, mask->mask를 만드는 기능, mask-> 3d obj를 만드는 기능 등등 2. 추후 오케스트레이션의 관리르 편하게 하기 위해 어떤 자원을 얼마나 소모하느냐 등의 공통점도 서비스 분리 기준으로 삼는다. I/O가 많이 필요하다, CPU 사용량이 많다, GPU 사용량이 많다 등등 3. 각 서비스는 같은 분류에 기능에 대해 확장성에 문제가 없어야한다. 코드 설계 원칙을 참고해 각 서비스별 주요 코드를 라이브러리로 정리함으로써, 추후 해당 서비스에 추가 기능이 발생하더라도, 같은 구조 내부에서 쉽게 추가될 수 있도록 서비스를 구성 Service EndPoint Parameter(request) Parameter(response) Detail Constraints nnUNet inference/totalseg image_path : str mask_path : str totalSegmentator를 실행시켜, 해당 이미지에 대한 Organ Mask를 저장하고, 저장한 Path를 반환 1mm보다 high resoulution을 가지는 이미지에 대해서는 더 나은 결과를 낼 수 없다 nnUNet inference/vessel image_A_path : str, image_P_path : str mask_path : str 2개 이미지의 파일 경로를 받아 image_A_path와 같은 물리적 공간을 가지는 신장,동맥,정맥 mask를 저장하고 해당 주소를 반환 A, P Phase에 해당하는 CT 이미지에 대해서만 유효한 결과를 낼 수 있다 nnUNet inference/ureter image_D_path : str mask_path : str 이미지 파일경로를 받아, 같은 물리적 공간을 가지는 요관, 신장 mask를 저장하고 해당 주소를 반환 D Phase .nii.gz에만 유효한 결과를 낼 수 있다 nnUNet inference/tumor image_path : str mask_path : str 이미지의 파일 경로를 받아, 같은 물리적 공간을 가지는 신장, 종양 mask를 저장하고 해당 주소를 반환 Smoothing smoothing/base mask_path : str obj_path : str 마스크의 파일 경로를 받아, 해당 마스크에 대한 3d obj파일을 만들고, 그 주소를 반환 mask의 label number가 사전에 약속된 규칙을 따라야함 postprocess postprocess/fat mask_path : str mask_path : str kidney, tumor, total 마스크를 기반으로 Fat mask를 생성해주고, 해당 경로를 반환 사전에 약속된 mask 규칙을 따라야함 postprocess postprocess/sample mask_path : str, templete_path : str mask_path : str 템플릿과 환자 mask(kidney, tumor가 있는)를 기반으로 빠른 mask를 생성해주고, 해당 경로를 반환 사전된 약속된 mask label number를 따라야함 postprocess postprocess/vessel mask_path : str mask_path : str 결과 마스크를 기반으로 떨어진 artery를 자동 연결하는 후처리 기능을 적용 후 저장, 그 경로를 반환 사전에 약속된 mask label number 규칙을 따라야함 postprocess postprocess/ureter mask_path : str mask_path : str 결과 마스크를 기반으로 떨어진 ureter를 자동 연결하는 후처리 기능을 적용 후 저장, 그 경로를 반환 사전에 약속된 mask label number 규칙을 따라야함 2. Clean code를 위한 원칙 설정 Single Responsibility 정의 하나의 클래스나 모듈은 오직 하나의 책임(변경 이유) 만 가져야 한다. 문제점 기존 코드에서 nnUNet 실행, preprocessing, 이미지 처리 등 여러 기능이 하나의 파일에 혼재되어 있다. → 재사용성과 유지보수성 저하 개선방향 각 모듈을 인공지능을 실행하는 모듈, 이미지와 메타데이터 정보를 얻는 모듈, 인공지능 실행 클래스를 생성하는 모듈 등 하나의 역할만 수행하도록 구조를 변경한다. 코드의 가독성과 재사용성을 강화 Dependency Inversion Principle(의존성 역전 원칙) 정의 상위 모듈은 하위 모듈의 구현이 아니라, 추상화(인터페이스/프로토콜) 에 의존해야 함. 문제점 nnUNet 사용 시, network, Predictor 등 객체를 직접 생성하고, 하드코딩된 파라미터를 사용하는 부분이 존재한다. 개선방향 config.yaml을 통해 하드 코딩되는 원인인 공통된 파라매터를 한 곳에 관리한다. 팩토리 패턴 또는 DI 컨테이너를 이용해 객체를 생성하여 공통된 모듈을 활용하더라도 다른 모델이나 구조를 쉽게 교체 가능하게 설계한다. Interface 통일 (프로토콜 정형화) 정의 여러 서비스가 공통된 메서드/구조/데이터 포맷을 따라야 함. 문제점 nnUNet과 달리 post-processing 서비스는 mask 이미지 -> mask 이미지를 생성하는 구조는 동일하지만, 해당 내용을 구현하는 코드 등에서 각각의 연구 내용에 따라 실행되는 로직이 상당히 다르다. 하지만 백엔드 입장에서는 마스크 -> 마스크를 생성하며 그때 마다 요구하는 label_name:label_num이 달라진다는 공통된 특징을 가지고 있다. 그렇기에 서로 다른 로직의 모듈을 관리하는 post-processing 서비스에서 프로토콜 정형화가 필요하다. 개선방향 공통 부모 클래스/프로토콜 정의 run(), save_output(), load_input() 등의 인터페이스 통일 Fali Fast & Logging 정의 오류가 발생하면 빠르게 실패하고, 즉시 원인을 알려야 함. 문제점 의료 데이터는 실행시간이 길고 리소스 소모가 큼 중간 실패를 늦게 알아채면 자원 낭비 발생 개선방향 초기 유효성 검사 강화 (파일 경로, config 유효성 등) 예외 발생 즉시 서비스 종료 및 명확한 로그 출력 로그는 표준화된 포맷과 단계별(Level별) 로깅 적용 (INFO, WARNING, ERROR) 모니터링 도구와 연계할 수 있도록 구조화된 로그(JSON 등) 제공 검토 3. MSA를 만들기 위해 고려되야할 추가적인 요소 Fail Fast 및 Logging을 전체 서비스 단위로 실행될 수 있게하는 logging 및 benchmark 시스템의 구성 MSA로 서비스가 변경되면서, 각 구조가 서로 다른 코드 환경이 gRPC로 통신하기에, 오류가 발생할 시 디버깅이 어려워지고, 문제가 발생했을 때 바로 알아차리기가 어려워진다. 이 점을 해결하기 위해 각 코드를 설계할 때 문제가 발생하면 대처할 수 있는 방안이 녹아드러야 하며, 전체 서비스 환경에서 log를 모으고 볼 수 있어야 한다. Orchstration nnUNet 서비스를 구현하며, API Gateway에서 각 서비스로 요청하고 각각의 기능을 각 AI의 inference 및 결과 저장까지 추상화를 완료하였지만, 실제 BE 서버가 요청하는 것은 하나의 이미지를 추론하여 저장하는 요청이 아닌, 하나의 케이스를 전달했을 때 각 AI 모델을 모두 활용하여 완전한 결과를 만드는 것이다. 이를 위해 API Gateway에서 각 기본 기능을 요청하는 것과, 이를 실제 BE 요청에 맞추어 통합실행하는 오케스트레이션 모듈을 생성하여, 이 곳에서 추상화를 통해 각 기능을 통합하는 모듈을 완성해야한다. 문서화 MSA를 구현하면서, 서비스끼리의 통신, 모듈끼리의 추상화를 통한 연결관계 등 재사용성을 위해 하나에 모여있던 코드들을 분리하고, 의존성 주입을 통해 생성하게 함로써 이러한 전체적인 구조가 정리될 필요성을 느꼈다. 그렇기에 시스템 흐름도 등 소프트웨어 공학에서 배운 각 모듈들의 의존관계 및 파라매터를 정리하는 과정이 필요하다. docker-compose화 현재의 시스템은 DockerFile을 만들어 두고 사전에 마운트 정보다, 연결된 docker network 이름 등을 사전에 미리 적어둔 shell 파일인 run.sh 파일을 실행시킴으로써 이미지 빌드와 컨테이너 실행에 필요한 정보를 재사용한다. 하지만 MSA로 만들어서 이런 기능등을 k8s같은 오케스트레이션 시스템이 관리하기 위해선 이를 docker-compose로 변경하여 관리를 해야한다. 완성된 기능 gRPC를 통한 통신 기능 proto 파일을 통해서 통신 구조를 정의하고, 공유된 data 마운트에서 통신한 경로 정보를 활용해 데이터를 가져오는 구조를 완성 nnUNet 서비스 <-> API Gateway 기본 통신 totalsegmentator 기능이 통신을 통해 실행되고, 결과를 저장하고, 저장된 파일 경로를 응답하는 구조의 완성 그리고 다른 vessel, ureter, tumor가 통신할 구조의 완성
Projects
· 2025-07-12
연구 기능 통합
개요 목적 Docker Container로 백엔드 내에서 nnUNet을 활용하는 연구 프로젝트 서비스를 완전히 분할하고, Image를 활용하는 부분은 하나로, 나머지 기능은 각각 배포환경을 다르게 구성하여, microservice처럼 각 기능을 연결한 프로젝트 제작하기 요구조건 nnUNet의 .nii.gz 데이터를 ndarray + props(nnUNet을 코드 상에서 실행하기 위한 또 다른 입력값)으로 추출해주는 SitkIO 함수를 활용해 I/O 횟수를 최소화(각 모델들을 한번의 I/O로 모두 실행가능하게) 메모리 소모량을 감소시키기 위해 각 알고리즘 실행 과정 속, 필요로 하는 최소값의 해상도로 알고리즘 수행 향후 다른 연구의 결합에 대한 유지/보수성 증가를 위해 CT Image를 직접적으로 활용하지 않는 다른 기능들은 따로 수행될 수 있도록 구성 구체화 Service Index Detail nnUNet 1 혈관, 요관, 구 버전 신장/종양, 구 버전 요관을 모델 별로 함수를 나누어 ndarray -> ndarray 구조로 각각 실행될 수 있도록 모듈화 nnUNet 2 조건에 따라 모델을 선택해, 해당 함수가 실행될 수 있도록 구조화 및 입출력 구조 요구조건 달성 (optional) nnUNet 3 빠르게 샘플을 만드는 기능을 추가, 만약 이를 추가할 거라면, 해당 서비스와 nnUNet 서비스가 병렬적으로 실행되고, obj 파일을 연속해서 업로드가 수행되야함 Smoothing 1 .nii.gz mask -> obj 파일로 만드는 업데이트된 기능(FE에 기능을 활용하기 위해선 해당 로직에 업데이트가 필요) post-processing 1 인공지능 inference 결과와, mask 결과를 활용하여 Fat mask를 추가해주는 기능 (optional) post-processing 2 nnUNet의 기능을 후처리 작업을 통해 보정해주는 역할 API Gateway 1 nnUNet 관련 기능, Smoothing 관련 기능, post-processing 관련 기능을 각각 container로 나누어 이를 연결해주는 역할 발견된 문제 1. 서비스에 분할에 관하여 마이크로 서비스로 얻고 싶었던 이점은 아래와 같았다. 1. 각 연구자들의 새로운 연구결과를 결합할 때 도커로 배포만 가능하면, monolithic에 결합하는 수고 없이, 통신으로 이를 해결 2. 각 연구자들의 연구 결과를 분리함으로써 다양한 라이브러리 사용되는 배포환경의 충돌 방지 그러나 현재의 백엔드 시스템은 연구자들이 주로 사용하는 nnUNet이라는 AI 아키텍쳐를 활용할 때 용량이 큰 의료이미지의 I/O 병목을 줄이기 위하여 , 해당 파일을 한번 불러오고, 저장 없이 전처리, AI inference, 후처리를 수행한 후 최종 결과만을 저장하여, 이를 활용한다. 이를 구현하기 위해선 각 서비스별로 I/O를 수행하지 않고, 모든 연구결과를 활용하기 위해서는 해당 서비스가 monolithic하게 존재해야한다. 이는 현재 마이크로 서비스를 만드려는 목적과 상충하는 결과이다. 그렇기에 앞으로 마이크로 서비스를 제작할 때는, 데이터 크기가 큰 의료이미지의 특성에 따라 발생하는 아래와 같은 문제를 고려해야한다. 1. 의료 '이미지'는 용량이 매우 크기에 I/O 병목이 존재하며, gRPC로 이미지 자체를 넘기는 것은 비효율적이다. 2. 여러 서비스가 각각 이미지를 병렬적으로 로드하고 처리한다면, 이에 따른 메모리 소모량을 고려해야한다. 3. 각 연구는 다양한 라이브러리를 사용하기에 이를 하나의 배포환경에 합쳐버리면, 유지/보수 및 안정성이 상당히 떨어진다. 이러한 문제를 해결하기 위한 아이디어는, 몇몇 서비스들은 의료이미지를 필수로 활용하진 않는 것이다. mask 데이터는 의료 이미지 데이터에 비해 훨씬 용량이 작으며, 이에 대한 I/O를 수행하는 것은 이미지에 비해 훨씬 작업 소모량이 적다. 그렇기에 이미지를 다루는 연구 결과물들은 성능 최적화를 위해 monolithic하게 수행할 수도 있겠지만, mask에 대한 처리를 수행하는 로직들에 대해서는 서비스를 나누는 것을 고려할 수 있다. 속도의 향상과 유지/보수성의 tradeoff를 고려하여 문제를 해결할 방법이 필요하다.
Projects
· 2025-07-10
Service:nnUNet 개발
개요 목적 nnUNet과 torch를 사용하는 각 연구 성과를 통합한 nnUNet 서비스의 개발 요구조건 nnUNet의 .nii.gz 데이터를 ndarray + props(nnUNet을 코드 상에서 실행하기 위한 또 다른 입력값)으로 추출해주는 SitkIO 함수를 활용해 I/O 횟수를 최소화(각 모델들을 한번의 I/O로 모두 실행가능하게) 메모리 소모량을 감소시키기 위해 각 알고리즘 실행 과정 속, 필요로 하는 최소값의 해상도로 알고리즘 수행 각각의 Container에 그냥 OS를 활용하는 이미지를 쓰지말고, Container의 용량을 감소시키는 작은 이미지를 활용할 것 3차 회의 요구사항 백엔드 개발자와 기존의 nnUNet 기능만을 통합하는 과정이 아닌, Smoothing, PostProcessing 기능 까지 고려하는 2번째 시스템 개발에 관하여 회의를 진행 마이크로 서비스를 수행할 때 Docker Image 경량화에 대한 이슈 이미지가 무거우면 빌드 시간, 배포 시간, 디스크 사용량, 네트워크 트래픽 모두 증가함. 각 Pod이 이미지 Pull을 할 때 용량이 작을수록 빠르고 안정적. smoothing, post-processing 서비스를 분리하면서 다른 기능들은 mask에 한정해서는 I/O가 필요하고, 기존의 저장되던 Segmentation 이외의 다른 정보를 저장할 필요성이 대두 해당 사항에 대해 TotalSegmenatator 혹은 inference 결과 등을 mask 디렉토리에 저장하고 활용하는 것에 대해 문제가 없음을 확인 서비스 API Service EndPoint Parameter(request) Parameter(response) Detail Constraints nnUNet inference/totalseg image_path : str mask_path : str totalSegmentator를 실행시켜, 해당 이미지에 대한 Organ Mask를 저장하고, 저장한 Path를 반환 1mm보다 high resoulution을 가지는 이미지에 대해서는 더 나은 결과를 낼 수 없다 nnUNet inference/vessel image_A_path : str, image_P_path : str mask_path : str 2개 이미지의 파일 경로를 받아 image_A_path와 같은 물리적 공간을 가지는 신장,동맥,정맥 mask를 저장하고 해당 주소를 반환 A, P Phase에 해당하는 CT 이미지에 대해서만 유효한 결과를 낼 수 있다 nnUNet inference/ureter image_D_path : str mask_path : str 이미지 파일경로를 받아, 같은 물리적 공간을 가지는 요관, 신장 mask를 저장하고 해당 주소를 반환 D Phase .nii.gz에만 유효한 결과를 낼 수 있다 nnUNet inference/tumor image_path : str mask_path : str 이미지의 파일 경로를 받아, 같은 물리적 공간을 가지는 신장, 종양 mask를 저장하고 해당 주소를 반환 개발과정 DockerFile 작성 고려사항 현재 BE 시스템에서 기존에 사용하던 torch version = 2.2.2, cuda가 존재하여 GPU를 사용할 수 있어야 한다. totalsegmentator, nnunet이 사용 가능해야한다. gRPC 기반 api endpoint 설정 api service와 nnUNet에 해당하는 docker container 제작, 공유된 볼륨에 동일한 경로로 접근 가능한지 테스트 통신 담당 함수와, 각 통신 결과를 각 함수에 전달하는 entrypoint 함수 제작 현재 생각한 구조 각 서비스는 통신 함수를 main.py로 가지며, 해당 main.py와 동일한 디렉토리에 각 서비스가 구성된 라이브러리가 존재 각 라이브러리는 api에 따라 1:1로 실행되는 함수 entrypoint를 가지며, 이를 라이브러리 최상단에 위치 라이브러리 내부에서 각 함수에 따라 구동되는 기능별로 폴더를 구분하며, utils 폴더에 잡다한 기능들을 넣어두기 각 서비스 별로 통일된 라이브러리 선언 규칙이 필요 totalSegmentator 함수 제작 진행 과정 totalsegmenator 라이브러리 설치 => 발견된 문제, warning으로 현재 사용하고 있는 라이브러리 중 하나가 2025.12.30에 사라질 예정이라고 함, 오류가 발생했을 때 참고 totalsegmentator는 RAM, GPU 사용량이 필요함, 현재 docker ram 사용량이 MB단위임을 발견, totalsegmentator를 구동시키기 위해 20GB로 변경, 다만 서버 컴퓨터의 스펙은 로컬 개발환경과 다르게 128GB의 램을 보유하고 있으므로, 해당 Docker Container는 100GB정도까지 가도 괜찮을 듯 하다. totalsegmentator를 돌릴 시 멀티프로세싱을 사용하기 때문에 이를 gRPC와 함께 사용할 떄 fork관련 이슈가 발생, main 함수에 multiprocessing을 import해주고, 미리 조치를 취하면 괜찮지만 이게 왜 문제가 생기는지에 대한 고찰이 필요. 테스트 진행 완료 mask/total_A.nii.gz로 저장 밑 return이 잘 수행됨을 확인 API Gateway에서 inference/totalseg를 case 폴더 -> 각 이미지 폴더로 어떤 식으로 연결을 지어야할지에 대한 고찰이 필요 추후 체크리스트 BE->API Gateway와 inference/totalseg API에 대한 연결을 어떻게 수행할 것인가. 멀티 프로세싱 fork관련 이슈가 왜 발생하는가. nnUNet pth 파일 기반 교체 가능한 함수 개발 vessel Feature 추출 함수 개발
Projects
· 2025-07-10
API 설계
개요 설계 개요 연구원들의 모든 연구 내용 기능을 통합하기 위해, 아래와 같은 전체 구조를 설계하였다. 기존의 BE 시스템 <-> API Gateway <-> 각 서비스 기존의 BE 시스템에서 CT Image를 기반으로 mask와 obj 파일을 생성하는 구조를 아예 분리함으로써, monolithic하게 운영되고 있던 BE 시스템의 라이브러리 충돌 가능성을 줄이고, 각 연구 결과를 각각의 서비스로 분리함으로써 기존에 존재하였던 torch 및 기반이 되는 nnUNet 라이브러리가 업데이트되었음에도 적용이 힘들었던 점. 각 연구가 사용하는 라이브러리가 너무 다양해 monolithic한 시스템에 적용하기 힘들었던점 새로운 기능을 추가할 때마다, 해당 기능과 BE를 연결할 때 코드 구조를 바꿔야할 필요가 생기는 점 같은 문제를 해결하기 위해, 연구 분야에 관련해 BE 시스템에서 분리하고, MSA처럼 운영하기 위해 전체 구조를 설계하였다. 서비스 분리 기준 nnUNet 서비스 혈관, 신장, 요관, 종양 등의 segmentation 기능을 AI Inference를 통해 수행하는 서비스 nnUNet과 그 기반 라이브러리(torch 등)에 의존하는 기능들을 통합, 관련 라이브러리가 업데이트될 때 적용하기 쉽게 통합 세부 기능별로 지나치게 분리하지 않되, nnUNet 기반의 서비스들을 모아두어, 모델 파라매터 파일만 교체한다면 쉽게 유지/보수가 가능하게 하나의 서비스로 구성 AI inference를 위해 GPU가 많이 필요하기 때문에, 별도 서비스로 분리 Smoothing 서비스 .nii.gz 마스크 파일을 3D Object 파일(.obj)로 변환하면서 Smoothing을 적용하는 후처리 기능을 담당 해당 기능은 trimesh, pyvista, open3d 등 3D 라이브러리를 사용하며, 관련 기능을 nnUNet 서비스는 필요로하지 않으므로, 유지/보수 성 증가를 위해 분리 해당 기능은 GPU 성능을 크게 필요로 하지 않으며, nnUNet 서비스의 결과물을 활용하여 3d obj를 만드는 역할이므로 기능을 분리하는 관점에서 서비스를 분리 Post-Processing 서비스 inference 결과를 후처리하여 Fat mask 추가, cugraph 기반 skeleton 재구성 등의 기능을 수행 nnUNet과 달리 GPU보다는 CPU 집약적인 작업이 많아 자원 관리 측면과 기능 분리 측면에서 서비스를 분리하는 것이 유리 라이브러리도 nnUNet, Smoothing 서비스에서 사용하는 라이브러리가 아닌 cugraph, skimage 등 다른 라이브러리를 주로 사용하느모 업데이트가 용이하게 분리 요구조건 nnUNet의 .nii.gz 데이터를 ndarray + props(nnUNet을 코드 상에서 실행하기 위한 또 다른 입력값)으로 추출해주는 SitkIO 함수를 활용해 I/O 횟수를 최소화(각 모델들을 한번의 I/O로 모두 실행가능하게) 메모리 소모량을 감소시키기 위해 각 알고리즘 실행 과정 속, 필요로 하는 최소값의 해상도로 알고리즘 수행 향후 다른 연구의 결합에 대한 유지/보수성 증가를 위해 CT Image를 직접적으로 활용하지 않는 다른 기능들은 따로 수행될 수 있도록 구성 각각의 Container에 그냥 OS를 활용하는 이미지를 쓰지말고, Container의 용량을 감소시키는 작은 이미지를 활용할 것 API 설계 API Gateway API 설계 Service EndPoint Parameter(request) Parameter(response) Detail Constraints nnUNet inference/totalseg image_path : str mask_path : str totalSegmentator를 실행시켜, 해당 이미지에 대한 Organ Mask를 저장하고, 저장한 Path를 반환 1mm보다 high resoulution을 가지는 이미지에 대해서는 더 나은 결과를 낼 수 없다 nnUNet inference/vessel image_A_path : str, image_P_path : str mask_path : str 2개 이미지의 파일 경로를 받아 image_A_path와 같은 물리적 공간을 가지는 신장,동맥,정맥 mask를 저장하고 해당 주소를 반환 A, P Phase에 해당하는 CT 이미지에 대해서만 유효한 결과를 낼 수 있다 nnUNet inference/ureter image_D_path : str mask_path : str 이미지 파일경로를 받아, 같은 물리적 공간을 가지는 요관, 신장 mask를 저장하고 해당 주소를 반환 D Phase .nii.gz에만 유효한 결과를 낼 수 있다 nnUNet inference/tumor image_path : str mask_path : str 이미지의 파일 경로를 받아, 같은 물리적 공간을 가지는 신장, 종양 mask를 저장하고 해당 주소를 반환 Smoothing smoothing/base mask_path : str obj_path : str 마스크의 파일 경로를 받아, 해당 마스크에 대한 3d obj파일을 만들고, 그 주소를 반환 mask의 label number가 사전에 약속된 규칙을 따라야함 postprocess postprocess/fat mask_path : str mask_path : str kidney, tumor, total 마스크를 기반으로 Fat mask를 생성해주고, 해당 경로를 반환 사전에 약속된 mask 규칙을 따라야함 postprocess postprocess/sample mask_path : str, templete_path : str mask_path : str 템플릿과 환자 mask(kidney, tumor가 있는)를 기반으로 빠른 mask를 생성해주고, 해당 경로를 반환 사전된 약속된 mask label number를 따라야함 postprocess postprocess/vessel mask_path : str mask_path : str 결과 마스크를 기반으로 떨어진 artery를 자동 연결하는 후처리 기능을 적용 후 저장, 그 경로를 반환 사전에 약속된 mask label number 규칙을 따라야함 postprocess postprocess/ureter mask_path : str mask_path : str 결과 마스크를 기반으로 떨어진 ureter를 자동 연결하는 후처리 기능을 적용 후 저장, 그 경로를 반환 사전에 약속된 mask label number 규칙을 따라야함 BE - API Gateway API 설계 추후 백엔드 담당자와의 토의 필요
Projects
· 2025-07-10
nnUNet 관련 기능 분리
개요 목적 2차 회의를 수행하고, 해당 내용을 적용하기 위해 기능 구현을 구체화하여 구현하는 과정을 정리 구체화 gRPC를 활용하여 서로 다른 Docker Container간 str, List[str] 통신을 활용가능하고, 공유된 마운트 Volume에 동일한 Path로 접근가능하게 구현 Server를 아래 2가지 옵션으로 구현 각종 ai관련 기능을 모두 통합한 monolithic한 서비스 혈관, 요관, 신장 등 각각 기능들을 microservice로 분리하고, 모두 동일한 volume mount에서 경로만 통신해 통합된 기능을 제작 정해진 서버의 옵션에 따라 요구사항에 맞춘 Resize기능 각종 nnUNet 취사선택 기능 (optional) 빠른 샘플 제작 기능 을 구현할 수 있도록 수행한다. 개발일정 Date To Do Process ~07.09 gRPC를 통한 통신 구조 및 볼륨 마운트를 통해 동일한 파일 접근 가능한지 테스트 수행 완료(07.09~07.09) ~07.10 monolithic하게 구현할지, microservice로 구현할지 결정 진행(07.09~) ~07.13 nnUNet을 Path만 가지고 있으면, Phase에 따라 실행하는 구조 생성 ~07.14 optional한 기능의 구현가능성에 따라 추가 발견된 문제 1. 서비스에 분할에 관하여 마이크로 서비스로 얻고 싶었던 이점은 아래와 같았다. 1. 각 연구자들의 새로운 연구결과를 결합할 때 도커로 배포만 가능하면, monolithic에 결합하는 수고 없이, 통신으로 이를 해결 2. 각 연구자들의 연구 결과를 분리함으로써 다양한 라이브러리 사용되는 배포환경의 충돌 방지 그러나 현재의 백엔드 시스템은 연구자들이 주로 사용하는 nnUNet이라는 AI 아키텍쳐를 활용할 때 용량이 큰 의료이미지의 I/O 병목을 줄이기 위하여 , 해당 파일을 한번 불러오고, 저장 없이 전처리, AI inference, 후처리를 수행한 후 최종 결과만을 저장하여, 이를 활용한다. 이를 구현하기 위해선 각 서비스별로 I/O를 수행하지 않고, 모든 연구결과를 활용하기 위해서는 해당 서비스가 monolithic하게 존재해야한다. 이는 현재 마이크로 서비스를 만드려는 목적과 상충하는 결과이다. 그렇기에 앞으로 마이크로 서비스를 제작할 때는, 데이터 크기가 큰 의료이미지의 특성에 따라 발생하는 아래와 같은 문제를 고려해야한다. 1. 의료 '이미지'는 용량이 매우 크기에 I/O 병목이 존재하며, gRPC로 이미지 자체를 넘기는 것은 비효율적이다. 2. 여러 서비스가 각각 이미지를 병렬적으로 로드하고 처리한다면, 이에 따른 메모리 소모량을 고려해야한다. 3. 각 연구는 다양한 라이브러리를 사용하기에 이를 하나의 배포환경에 합쳐버리면, 유지/보수 및 안정성이 상당히 떨어진다. 이러한 문제를 해결하기 위한 아이디어는, 몇몇 서비스들은 의료이미지를 필수로 활용하진 않는 것이다. mask 데이터는 의료 이미지 데이터에 비해 훨씬 용량이 작으며, 이에 대한 I/O를 수행하는 것은 이미지에 비해 훨씬 작업 소모량이 적다. 그렇기에 이미지를 다루는 연구 결과물들은 성능 최적화를 위해 monolithic하게 수행할 수도 있겠지만, mask에 대한 처리를 수행하는 로직들에 대해서는 서비스를 나누는 것을 고려할 수 있다. 속도의 향상과 유지/보수성의 tradeoff를 고려하여 문제를 해결할 방법이 필요하다.
Projects
· 2025-07-09
2차 회의 - 추가 요구사항 발생
추가 요구사항 현 진행상황 백엔드 서버를 구성하기 위해, 어떠한 백엔드 구성요소가 있고, 우리가 유지/보수, 최적화, 인수인계 가능성을 고려하여 어떠한 프레임워크들을 각 백엔드 구조에 활용할지 조사를 진행중 각 연구 프로젝트를 공유가 용이하기 위해 Docker로 구성을 변경 문제상황 백엔드 서버를 구성하기 위해, 어떤 프레임워크를 사용해야 하는가에 대한 조사를 수행하던 중, 2주 내로 각 연구의 결과물인 기능들을 통합하고, 하나의 제품으로 기능할 수 있도록하는 클라이언트의 요구사항이 발생 데드라인 이내에 해당 기능을 만들 수 있도록, 기존에 조사한 내용인 gRPC 기반의 microservice로 백엔드를 구성하는 인공지능 + 알고리즘 부분을 마이크로 서비스로 구현해, 기존의 백엔드와 연결되도록 만들 필요가 발생 해결방안 기존의 백엔드 담당자와 이 문제를 어떻게 해결할지 논의를 수행한 후 결론을 아래와 같이 내렸다. 기존의 백엔드는 아래와 같이 기능이 수행된다. 1, 2 Model(각각 담당하는 mask가 다르다.) N CT Image |--------| N mask A CT Image | | A mask ---> | Model | ---> P CT Image | | P mask D CT Image |________| D mask 그러나 현재의 ai 알고리즘은 퀄리티 좋은 결과를 위해 각각의 담당하는 mask 별로 일부 mask만 생성이 가능하다. vessel model |--------| A CT Image | | ---> | Model | ---> A mask P CT Image | | |________| ureter model |--------| | | D CT Image ---> | Model | ---> D mask | | |________| kidney/tumor model N CT Image |--------| N mask A CT Image | | A mask ---> | Model | ---> P CT Image | | P mask D CT Image |________| D mask 해당 과정을 수행하기 위해서는 우리는 각 Phase CT가 존재하는 경우, 향상된 알고리즘을 적용해 퀄리티가 좋은 결과를 존재하지 않는 경우, 퀄리티는 낮더라도 일반화가 잘된 기존의 모델을 활용하여 알고리즘 서비스 부분 백엔드 컨테이너를 구성해야한다. 기존의 백엔드와 결합을 위한 요구사항 image와 mask를 저장할 디렉토리의 절대경로가 함수의 입력값으로 주어질 것이다. 각 도커 컨테이너들은 공유된 하나의 볼륨을 마운트하여, 동일한 경로로 접근이 가능해야한다. 해당 알고리즘을 활용하여, 각 이미지 Phase에 해당하는 mask를 출력으로 줄 수 있어야 한다. 메모리 절약을 위해 인공지능이 필요한 정도의 spacing으로 이미지를 압축시켜 메모리 사용량을 줄여야한다. 따라서 아래와 같은 백엔드 컨테이너를 구성할 것이다. Step 0. 각 컨테이너는 gRPC를 통해서 파일 경로를 주고 받을 수 있어야한다. 그래서 예시 파일로 케이스 주소를 전달하는 Client Container, 해당 주소를 활용해 아래 Step을 실행하는 Server Container로 예시를 만든다. Step 1. 입력 폴더에 존재하는 이미지를 ai의 조건들을 분석하여, 그 중 가장 high resolution으로 resample해 임시로 저장한다.(모든 작업이 종료된 후 삭제 필요) Step 2. 아래의 조건에 따라 AI 알고리즘을 적용하여 결과값을 얻어낸다. Condition 1. A, P, D Phase가 존재할 때 1. A mask에 혈관, 종양, 신장 mask를 ai결과로 생성 2. D phase를 통해 생성된 요관 mask를 A phase로 옮겨 최종 결과 생성 3. 최종 mask를 각각의 N, P, D 이미지로 옮겨 각각 CT에서 각 기관의 대략적인 위치를 확인할 수 있게 생성 4. 각 Phase의 최종 마스크를 저장하고, 경로를 List로 저장해 반환 Condition 2. Missing Phase가 존재할 때 Condition 2-1. A or P Phase가 Missing Phase일 때 1. N, A, P, D의 신장, 혈관에 관련된 기존의 알고리즘을 적용한다.(Model 1) 2. obj를 만드는 이미지에 대한 prior를 기존의 내용을 활용한다. Condition 2-2. D Phase가 Missing Phase일 때 1. 요관 관련 모델을 활용하지 않는다. 해당 조건들에 따라 향상된 혈관을 RESAMPLE해 옮기던, 기존의 알고리즘으로 만든 것 + 요관 알고리즘 적용 여부를 최종 mask로 활용한다. 다만 Resample 적용 여부는 추후 필요성이 없어질 수도 있으므로, on/off가 가능하게 파라매터 입력을 받을 수 있게 한다. Step 3. 아래와 같은 입출력 구조를 가지도록 함수를 구성한다. input (case_directory : str, resample_condition : bool) 중간 과정 속에서 result_paths에 각 mask 결과물 실제 저장도 필요. output (result_paths : List[str])
Projects
· 2025-07-09
1. 백엔드 구성 요소 정리
백엔드 구성요소에 대하여 현 진행상황 전체 백엔드 개요도 1. 백엔드가 연결된 대상 : FrontEnd, End Device 등등 해당 내용은 백엔드의 일부는 아니지만, 백엔드는 결국 End Device 및 Front End와 통신이 수행되야하므로, 해당 내용들이 어떠한 방식으로 통신을 주고받는지에 대한 고려가 필요하다. 2. 백엔드의 통신 구조 : API, Web Server API(Application Program Interface) : 백엔드끼리 혹은 프론트 엔드와 어떻게 통신을 수행할지 통신 구조에 대하여 설명 3. Logging Local Server log 혹은 전체 백엔드 시스템의 log를 모아서 관리하는 시스템 4. File Storage 5. Queue 6. DataBase 7. CI/CD 연구결과를 microservice로 통합하기 위해, 현재 제작중이 repogitory에서 기존의 연구 결과를 Docker를 통해 통합하여, 각 연구 결과가 Docker만 존재한다면 어느 환경에서든 실행되고, 이를 Docker Network로 통합하여 서로 간의 일반적인 통신(string, int, float, image 등)은 통신될 수 있도록 구현이 완료되었다. 이러한 프로젝트의 시스템을 monorepo로 만들어 아래 링크에 제작하였다. 문제상황 현재 이 작업을 수행하기 위한 연구원들의 가장 큰 문제점은 백엔드에 대한 전반적인 지식이 부족한 것이다. 개요에 존재하는 ARNA의 현 상황을 해결하기 위해 microservice + gRPC가 효과적인 해결책이 될 수 있겠다는 정보를 찾아냈으나, 이게 정말 최선의 선택인지에 관해 판단할 백엔드에 전반적인 지식을 가진 검토자가 존재하지 않는다. 이러한 문제를 해결하기 위해 백엔드에 대한 지식의 큰 줄기를 만들 필요성이 대두되었다 해결방안 이러한 회사의 제품이 앞으로 변경될 시스템에 따라 관리되야하고, 기본적으로 연구에 관련된 지식에 치중되어, Docker 등과 같은 배포를 위한 세팅이 대부분 수행되지 않은 연구의 결과물을 활용하기 위해서, 백엔드 시스템을 만들 필요성이 대두되었다. 그러나 현재 연구원들중 백엔드 지식을 폭넓게 알고 있는 능력을 가진 연구원은 없는 상태이며, 이러한 문제점을 해결하기 위해 백엔드를 구성하는 다양한 요소를 정리한다. 해당 요소 내에서 어떠한 구체적인 내용들이 있는지를 백엔드 개발자 로드맵을 통해 정리한다. 정리된 각 내용들의 장단점을 분석한다. 위 내용을 기반으로, 우리의 제품이 필요한 요구사항을 정리해보고 각 요소별 최적화, 하드웨어 요구사항, 보안 등의 요소를 고려해 어떤 요소에 어떠한 구성요소를 선택할지 결정한다. 위의 과정을 수행하여, 최적의 백엔드 시스템을 구성해보고 이를 유지/보수가 가능하게 만드는 것이 백엔드 서버를 구현하는 1차적인 목표이다. 이를 수행하기위해 Github Blog에 새로운 BE 탭을 만들어 전체적인 지식에 대해 정리해본다. 참고자료 코딩애플 : 마이크로서비스란 무엇인가 마이크로서비스의 구성요소 기술노트 : 백엔드 정리
Projects
· 2025-07-08
1차 회의 - 방향성 결정
백엔드 서버를 어떻게 구성할 것인가? 현 진행상황 연구결과를 microservice로 통합하기 위해, 현재 제작중이 repogitory에서 기존의 연구 결과를 Docker를 통해 통합하여, 각 연구 결과가 Docker만 존재한다면 어느 환경에서든 실행되고, 이를 Docker Network로 통합하여 서로 간의 일반적인 통신(string, int, float, image 등)은 통신될 수 있도록 구현이 완료되었다. 이러한 프로젝트의 시스템을 monorepo로 만들어 아래 링크에 제작하였다. 문제상황 현재 이 작업을 수행하기 위한 연구원들의 가장 큰 문제점은 백엔드에 대한 전반적인 지식이 부족한 것이다. 개요에 존재하는 ARNA의 현 상황을 해결하기 위해 microservice + gRPC가 효과적인 해결책이 될 수 있겠다는 정보를 찾아냈으나, 이게 정말 최선의 선택인지에 관해 판단할 백엔드에 전반적인 지식을 가진 검토자가 존재하지 않는다. 이러한 문제를 해결하기 위해 백엔드에 대한 지식의 큰 줄기를 만들 필요성이 대두되었다 해결방안 이러한 회사의 제품이 앞으로 변경될 시스템에 따라 관리되야하고, 기본적으로 연구에 관련된 지식에 치중되어, Docker 등과 같은 배포를 위한 세팅이 대부분 수행되지 않은 연구의 결과물을 활용하기 위해서, 백엔드 시스템을 만들 필요성이 대두되었다. 그러나 현재 연구원들중 백엔드 지식을 폭넓게 알고 있는 능력을 가진 연구원은 없는 상태이며, 이러한 문제점을 해결하기 위해 백엔드를 구성하는 다양한 요소를 정리한다. 해당 요소 내에서 어떠한 구체적인 내용들이 있는지를 백엔드 개발자 로드맵을 통해 정리한다. 정리된 각 내용들의 장단점을 분석한다. 위 내용을 기반으로, 우리의 제품이 필요한 요구사항을 정리해보고 각 요소별 최적화, 하드웨어 요구사항, 보안 등의 요소를 고려해 어떤 요소에 어떠한 구성요소를 선택할지 결정한다. 위의 과정을 수행하여, 최적의 백엔드 시스템을 구성해보고 이를 유지/보수가 가능하게 만드는 것이 백엔드 서버를 구현하는 1차적인 목표이다. 이를 수행하기위해 Github Blog에 새로운 BE 탭을 만들어 전체적인 지식에 대해 정리해본다.
Projects
· 2025-07-08
<
>
Touch background to close