trial 1
방법: python에서 작업해서 csv 파일로 저장 후 julia에서 불러오기
문제:
저장이 오래 걸림
파일이 생기긴 하는데 데이터 손실이 생김 (row가 11857이어야 하는데 julia에서 불러오면 최대 약 2백여개 정도만 존재)
원인: 대용량 DataFrame이므로 읽고 쓰는 속도가 매우 느림. 특히 숫자가 많은 대규모 행렬에선 비효율적
제시한 해결 방안
.feather
또는 .parquet
형식 저장 → 선택 (빠르게 저장이 되며 pandas랑 호환 가능하고 용량 작게 저장됨)
chunksize
활용 → 저장 데이터 파일이 여러 개 생김 (julia의 input으로는 데이터를 하나만 받으므로 실제 scICE에 들어가기 전 후처리 작업이 한 번 더 진행해야할 거 같음)
numpy 변환 후 csv파일로 저장 → 헤더와 인덱스 없이 숫자만 저장됨 (julia에서 후처리 작업 필요)
trial 2
pyarrow
로 .feather
또는 .parquet
형식 저장feather
와 parquet
모두 저장이 되었지만, 0바이트임. 즉, 데이터가 다 날라감 (그 원인은 못 찾았음)trial 3
zipfile.ZipFile
+ io.StringIO
or BytesIO
trial 4
방법: scICE를 돌릴 julia 파일 내에서 data 전처리 진행
(즉, 애초에 저장된 파일을 불러오는 방식이 아닌 input data 형태로 만든 dataframe을 모델에 바로 넣어 사용.)
결과:
RAM 터짐..
ERROR: OutOfMemoryError()
: 시스템 메모리(RAM)가 부족 (일단은 하드웨어적 문제)해결방안:
RAM 용량 늘리기 → 불가능 (RAM 구매)
데이터 크기 줄이기 → 가장 현실적인 방법
보통은 딥러닝 모델 돌릴 때 RAM에 한번에 데이터를 올릴 수 없기 때문에 batch처리를 진행함 → 하지만 큰 배치 사이즈로 처리해야 모델 성능이 높아지기 때문에 이와 같은 효과를 얻기 위해 gradient accumulation을 적용
⇒ BUT, 이의 경우 chunk나 batch를 적용하면 안된다고 생각하는게 UMAP을 그릴때 cell들 간의 거리를 계산해야함 → 이는 상대적인 것이므로 나눈 데이터별, batch별로 비교해서 knn를 계산하면 안 될 거 같음.
⇒ 해결해볼 수 있는 방안으로는,
knn 말고 다른 거리 계산 기법을 적용해야할 거 같음. (상대적인 거리 계산이 아닌 기법) : 코드 수정을 해야 함 (현재는 github에 올라온 example.jl을 사용하고 있음. 최대한 하이퍼파라미터만 수정하는 방안으로 가는 게 좋은데 이의 경우, 코드를 다시 뜯어 고쳐야 함… (embedding 단계에 걸쳐있는 함수만 약 13개 정도))
chunk나 batch 처리 → 여러 데이터셋에 대해 knn을 굉장히 많이 수행 → 한 cell에 대한 다른 cell들의 거리 정보가 굉장히 많을테니 거기서 상대적 거리 측정….? : 이는 저의 가설일 뿐 사실 가능한지 말이 되는지는 잘 모르겠습니다. 하지만 된다고 한들, 비용/시간이 많이 들 거 같음. 또한 이 비용/시간을 들여서 해도 나온 UMAP/클러스터링 결과가 정확할지는 미지수.
제가 생각하는 가장 현실적으로 scICE를 돌려볼 수 있는 방법은,
⇒ 즉, sub clustering을 매우 많이 반복: 시간이 많이 들겠지만, 상대적으로 정확도/가능성이 있다고 생각함.