facebookresearch/flowmm 사용 가이드
요약
본 가이드는 facebookresearch/flowmm를 사용하여 구조 데이터를 학습하고 평가하는 방법을 안내합니다. micromamba 환경 설정부터 데이터 로드, 모델 옵션 선택 및 최종적인 성능 평가까지의 전 과정을 다룹니다. 특히 다양한 매니폴드를 활용하여 원자 유형과 격자를 피팅하는 구체적인 스크립트 실행 예시를 제공합니다.
핵심 포인트
- FlowMM 사용을 위해 micromamba 환경 설정이 권장됩니다.
- 데이터셋은 data/ 폴더의 .csv 형식이며, 학습 시 자동 변환됩니다.
- 원자 유형 매니폴드와 격자 매니폴드를 조합하여 모델 옵션을 선택할 수 있습니다.
- evaluate.py 스크립트는 테스트 세트 재구성 및 성능 지표(match rate, RMSE) 계산에 사용됩니다.
파일을 가져오는 단계는 다음과 같습니다:
# 이 레포지토리를 flowmm 폴더로 클론합니다.
cd flowmm
git submodule init
...
서브모듈에는 CDVAE, DiffCSP 및 Riemannian Flow Matching이 포함되어 있습니다.
이제 flowmm을 설치할 수 있습니다.
conda가 매우 느리기 때문에 micromamba 사용을 권장합니다. micromamba는 해당 가이드를 따라 설치할 수 있습니다. 만약 설치에 실패하면 몇 번 더 시도해 보세요.
micromamba env create -f environment.yml
다음 명령어로 활성화합니다:
micromamba activate flowmm
학습 데이터는 data/ 폴더의 .csv 형식입니다. 처음으로 데이터를 학습하면 스크립트가 이 데이터를 로드하기 더 빠른 형식으로 변환할 것입니다.
만약 헐(hull) 위의 에너지를 계산하고 싶다면, 2023-02-07 날짜의 볼록 껍질(convex hull)을 다운로드해야 합니다. 파일을 mp_02072023/ 폴더에 추출하세요.
이 헐은 Matbench Discovery에서 얻었습니다.
학습할 수 있는 다양한 데이터셋은 다음과 같습니다:
data ext{ } ext{ extless} ext{perov, carbon, mp_20, mpts_52} ext{ extgreater}
scripts_model/conf/model에는 몇 가지 미리 선택된 model 옵션이 있습니다. 형식은 {원자 유형 매니폴드}_{격자 매니폴드}입니다.
원자 유형 매니폴드 (Atom type manifolds):
abits: FlowMM에서 사용하도록 제안된 유사 비트(analog bits)null: 조건부 생성을 위해 사용되는simplexdiffcsp: DiffCSP에서 원자 유형을 피팅하는 데 사용되는 방법
격자 매니폴드 (Lattice manifolds):
nonsym: DiffCSP에서 격자를 피팅하는 방법params: FlowMM에서 제안된 방법, 격자 파라미터 (params_normal_base)params_normal_base: 격자 매개변수 베이스 분포가 가우시안이고 제한 공간으로 전송되지 않는 제거 버전(ablated version).
python scripts_model/run.py data=perov model=null_params
python scripts_model/run.py data=perov model=abits_params
평가에 대한 논의는 FlowMM으로 제한됩니다. scripts_model/evaluate.py는 click을 사용하여 다목적 평가 프로그램 역할을 할 수 있게 합니다.
이 명령어들은 다음을 수행합니다:
test세트를 재구성하고 결과를 올바른 형식의 단일 torch pickle 파일로 통합합니다.test와 비교하여 매치율(match rate)과 제곱 평균 제곱근 오차(root mean square error)를 계산합니다.
격자 매개변수 분포를 test와 비교하여 플롯을 생성합니다.
set
사용자는 다음 세 가지 값을 제공해야 합니다:
PATH_TO_CHECKPOINT,
NAME_OF_SUBDIRECTORY_AT_CHECKPOINT,
SLOPE_OF_INFERENCE_ANTI_ANNEALING.
ckpt=PATH_TO_CHECKPOINT
subdir=NAME_OF_SUBDIRECTORY_AT_CHECKPOINT
slope=SLOPE_OF_INFERENCE_ANTI_ANNEALING
...
이 명령어들은 다음을 수행합니다:
- 체크포인트에서 10k개의 구조를 생성합니다.
- 결과를 올바른 형식의 단일 torch pickle 파일로 통합합니다.
test와 비교하여 De Novo Generation 프록시 지표를 계산합니다.
격자 매개변수 분포를 test와 비교하여 플롯을 생성합니다.
set
사용자는 다음 세 가지 값을 제공해야 합니다:
PATH_TO_CHECKPOINT,
NAME_OF_SUBDIRECTORY_AT_CHECKPOINT,
SLOPE_OF_INFERENCE_ANTI_ANNEALING.
ckpt=PATH_TO_CHECKPOINT
subdir=NAME_OF_SUBDIRECTORY_AT_CHECKPOINT
slope=SLOPE_OF_INFERENCE_ANTI_ANNEALING
...
이전 단계에서 생성된 구조들을 사용하여 CPU에서 CHGNet으로 사전 완화(prerelax)할 수 있습니다. 이 스크립트는 로컬에서 작동하지만, slurm 클러스터의 노드에 걸쳐 프로세스를 병렬화하도록 설계되었습니다.
slurm을 사용하려면 사용자는 YOUR_SLURM_PARTITION을 제공해야 합니다.
# 구조 경로를 가져옵니다
eval_for_dft_pt=$(python scripts_model/evaluate.py consolidate "${ckpt}" --subdir "${subdir}" --path_eval_pt eval_for_dft.pt | tail -n 1)
# eval_for_dft_json을 가져옵니다
...
VASP를 사용하여 밀도 범함수 이론(DFT)을 수행하여 계속할 수 있습니다.
사용자는 VASP 라이선스가 필요한 PATH_TO_YOUR_PSEUDOPOTENTIALS를 제공해야 합니다.
export PMG_VASP_PSP_DIR=PATH_TO_YOUR_PSEUDOPOTENTIALS
# dft 파일을 저장할 폴더를 생성합니다
dft_folder="${parent}/dft"
...
DFT 실행에 대한 지침은 제공하지 않습니다.
귀하의 DFT 결과는 일반적으로 Materials Project의 설정으로 보정되어야 함을 알려드립니다.
(보정된) DFT 완화 에너지 또는 CHGNet 사전 완화 에너지를 사용하여 헐(hull) 위의 에너지를 계산할 수 있습니다.
참고: 이 전체 섹션은 위에서 볼록 껍질(convex hull)을 다운로드해야 합니다!
CHGNet 사전 완화 에너지(prerelaxed energies)를 사용하려면 다음 명령어를 사용할 수 있습니다. 사전 완화 에너지는 일반적으로 부정확하므로, .json 파일에 별도의 열로 기록됩니다.
json_e_above_hull="${parent}/ehulls.json"
python scripts_analysis/ehull.py "${eval_for_dft_json}" "${json_e_above_hull}"
DFT 계산을 사용하려면 다음 코드를 사용할 수 있습니다. 저희 스크립트는 clean_outputs 디렉토리에 이름이 ######.traj인 궤적 파일(trajectory files)이 포함되어 있다고 예상하며, 여기서 ######는 ${eval_for_dft_json} 파일의 해당 행 인덱스에 해당합니다.
clean_outputs_dir="${parent}/clean_outputs"
json_e_above_hull="${parent}/ehulls.json"
python scripts_analysis/ehull.py "${eval_for_dft_json}" "${json_e_above_hull}" --clean_outputs_dir "${clean_outputs_dir}"
저희가 대신 보정해주는 스크립트가 있지만, 이 역시 저희 형식에 맞춰야 합니다. 루트 디렉토리에는 (1) scripts_analysis/dft_create_inputs.py를 사용하여 생성된 dft라는 하위 디렉토리와 (2) 이름이 ######.traj인 궤적 파일(trajectory files)을 포함하는 clean_outputs라는 하위 디렉토리가 있어야 하며, 여기서 ######는 ${eval_for_dft_json} 파일의 해당 행 인덱스에 해당합니다.
root_dft_clean_outputs="${parent}"
ehulls_corrected_json="${parent}/ehulls_corrected.json"
python scripts_analysis/ehull_correction.py "${eval_for_dft_json}" "${ehulls_corrected_json}" --root_dft_clean_outputs "${root_dft_clean_outputs}"
가장 정확한 S.U.N. 구조 추정치는 보정된 DFT 완화 에너지(corrected DFT relaxed energies)를 사용할 때 얻어집니다.
sun_json=sun.json
python scripts_analysis/novelty.py "${eval_for_dft_json}" "${sun_json}" --ehulls "${ehulls_corrected_json}"
FlowLLM 모델은 LLM을 RFM 모델의 학습된 기본 분포로 사용하여 RFM과 CrystalLLM을 결합합니다.
FlowLLM을 처음부터 훈련하려면 먼저 CrystalLLM 모델을 훈련해야 합니다. https://github.com/facebookresearch/crystal-text-llm에서 CrystalLLM 코드베이스를 가져오세요. 해당 레포지토리의 지침에 따라 MP-20 데이터셋으로 LLaMA 모델을 파인튜닝합니다. 훈련 후, 해당 모델로부터 대량의 샘플을 생성하고 RFM 모델을 훈련할 데이터셋을 만드세요.
편의를 위해 FlowLLM 논문에서 사용된 데이터의 일부는 다음 경로에서 이용 가능합니다: data/mp20_llama/
이러한 훈련 데이터가 생성되면, FlowMM과 마찬가지로 조건부 훈련(Conditional Training)을 통해 FlowLLM 모델을 훈련할 수 있습니다. 초기 샘플을 데이터셋 파일에서 읽어오도록 base_distribution_from_data=True를 설정하는 것을 잊지 마세요.
python scripts_model/run.py data=mp20_llama model=null_params base_distribution_from_data=True
만약 이 레포지토리가 귀하의 출판물에 도움이 되었다면, 다음 논문을 인용하는 것을 고려해 주십시오:
@inproceedings{
miller2024flowmm,
title={Flow{MM}: Generating Materials with Riemannian Flow Matching},
...
flowmm은 LICENSE.md 파일에서 볼 수 있듯이 CC-BY-NC 라이선스를 따릅니다. 하지만, git 서브모듈들은 다른 라이선스 조건을 가질 수 있습니다:
cdvae: MIT License
DiffCSP-official: MIT License
riemmanian-fm: CC BY-NC 4.0 License
의존성(dependencies)에 대한 라이선스는 해당 프로젝트의 홈페이지에서 확인할 수 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub AI Coding Assistants의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기