본문 바로가기

Contact English

【머신러닝】 AlphaGeometry 설치 및 이해

 

AlphaGeometry 설치 및 이해

 

추천글 : 【알고리즘】 알고리즘·머신러닝 목차 


1. 개요 [본문]

2. 설치 과정 [본문]


a. IMO 기하 문제 풀이

b. 자연어 처리와 거대 언어 모델


아직 에러가 나는 부분이 있어 트러블슈팅 중입니다. (24.05.12)


 

1. 개요 [목차]

AlphaGeometry : 네이처 논문에 투고된 언어 모델로서 symbolic deduction을 구현하여 IMO 수준의 기하 문제를 풀 수 있음

⑵ symbol의 의미 : 각 명제를 벡터화(vectorization)하여 임베딩 스페이스 위에 올려놓는 것 

⑶ 기하학에서의 symbolic deduction 《유클리드 원론》처럼 직선, 작도, 동심원 등에 관한 공리에서 시작하여 새로운 명제를 만들어 나가는 것

⑷ 문제의 조건이 주어져 있을 때, 주어진 명제를 증명하기 위해 search space 안에서 계속 새로운 참인 명제들을 탐색하는 접근을 취함

⑸ 위 과정은 사람이 한 수학 문제를 오래 고민할 때 비로소 답을 찾아내는 것에 비유할 수 있음

⑹ Google DeepMind에서 만든 알고리즘으로, 가설을 생성하는 모델인 FunSearch에서 더 발전시켜 만든 것으로 보여짐 (ref)

 

 

2. 설치 과정 [목차]

공식 문서에서와 같은 절차로 설치하면 오류가 나서 다음과 같은 절차를 따름 

단계 1. Ubuntu 서버에서 다음을 실행 : 필자의 경우 Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-105-generic x86_64)를 사용

 

sudo apt install python3-virtualenv
conda create -n alphageometry python=3.10.9
conda activate alphageometry
git clone https://github.com/google-deepmind/alphageometry.git
cd alphageometry
pip install array-record==0.4.1
pip install clu==0.0.7
pip install seqio==0.0.18
pip install seqio-nightly==0.0.17.dev20231013 
pip install t5==0.9.4
pip install tensorflow-datasets==4.9.3
pip install mesh-tensorflow[transformer]==0.1.21
pip install tfds-nightly==4.9.2.dev202308090034

 

단계 2. requirements.txt에서 다음과 관련된 설치 내용을 삭제

① array-record

② clu

③ seqio

④ seqio-nightly

⑤ t5

⑥ tensorflow-datasets

⑦ mesh-tensorflow[transformer]

⑧ tfds-nightly

단계 3. bash run.sh : 원래 이 코드 한 줄로 단계 1, 단계 2를 상당 부분 생략할 수 있지만 패키지 에러가 발생함

① 위 코드 실행 시 gdown --folder https://bit.ly/alphageometry 부분에서 에러가 남

단계 4. 다음 링크에 있는 checkpoint 파일들을 다운로드 받아서 ag_ckpt_vocab 폴더에 넣기

checkpoint_10999999 : https://drive.google.com/uc?id=1qXkmmgoJ8oTYJdFV1xw0xGPpQj6SyOYA

geometry.757.model : https://drive.google.com/uc?id=1t-r3KfU8aDbS1UHpdyM3LH21rwSCIXTz

geometry.757.vocab : https://drive.google.com/uc?id=1mRd6J0UkeWoFUjeVB7BQi5lVNLvPBe31

단계 5. bash run.sh에서 실행시키지 못한 남은 코드를 실행

 

MELIAD_PATH=meliad_lib/meliad
mkdir -p $MELIAD_PATH
git clone https://github.com/google-research/meliad $MELIAD_PATH
export PYTHONPATH=$PYTHONPATH:$MELIAD_PATH

DDAR_ARGS=(
  --defs_file=$(pwd)/defs.txt \
  --rules_file=$(pwd)/rules.txt \
);

BATCH_SIZE=2
BEAM_SIZE=2
DEPTH=2

SEARCH_ARGS=(
  --beam_size=$BEAM_SIZE
  --search_depth=$DEPTH
)

LM_ARGS=(
  --ckpt_path=$DATA \
  --vocab_path=$DATA/geometry.757.model \
  --gin_search_paths=$MELIAD_PATH/transformer/configs \
  --gin_file=base_htrans.gin \
  --gin_file=size/medium_150M.gin \
  --gin_file=options/positions_t5.gin \
  --gin_file=options/lr_cosine_decay.gin \
  --gin_file=options/seq_1024_nocache.gin \
  --gin_file=geometry_150M_generate.gin \
  --gin_param=DecoderOnlyLanguageModelGenerate.output_token_losses=True \
  --gin_param=TransformerTaskConfig.batch_size=$BATCH_SIZE \
  --gin_param=TransformerTaskConfig.sequence_length=128 \
  --gin_param=Trainer.restore_state_variables=False
);

echo $PYTHONPATH

 

단계 6. 설치는 완료되었지만 몇몇 오류가 있어서 다음 패키지들을 설치하여야 함

 

pip install matplotlib

sudo apt-get install xvfb
sudo apt-get install python3-tk
Xvfb :1 -screen 0 1024x768x16 &
export DISPLAY=:1.0

pip uninstall flax jax jaxlib
pip install flax==0.5.3 jax==0.4.6 jaxlib==0.4.6

 

단계 7. 이제 ddar 모드로 AlphaGeometry를 실행할 수 있음

 

python -m alphageometry \
--alsologtostderr \
--problems_file=$(pwd)/imo_ag_30.txt \
--problem_name=translated_imo_2000_p1 \
--mode=ddar \
"./defs.txt"

 

단계 8. alphageometry 모드로 실행하려면 다음과 같은 .gin 파일들을 ./에 옮겨야 함

./meliad_lib/meliad/transformer/configs/base_htrans.gin 파일을 ./에 옮기기

./meliad_lib/meliad/transformer/configs/memory_configuration.gin 파일을 ./에 옮기기

./meliad_lib/meliad/transformer/configs/trainer_configuration.gin 파일을 ./에 옮기기

단계 9. lax_numpy.py 수정

① 문제 발생 : alphageometry 모드로 AlphaGeometry를 실행 시 다음 에러 메시지가 발생함

② 에러 메시지 : TypeError: JAX only supports number and bool dtypes, got dtype bfloat16 in astype 외 3개

③ 해결 방법 : nano {path_to_lax_numpy}/lax_numpy.py 후 다음과 같이 수정 

 

# before
... (skip)
dtypes.check_user_dtype_supported(dtype, "astype")
... (skip)
dtypes.check_user_dtype_supported(dtype, "astype")
... (skip)
dtypes.check_user_dtype_supported(dtype, "asarray")
... (skip)
dtypes.check_user_dtype_supported(dtype, "array")
.. (skip)
dtypes.check_user_dtype_supported(dtype, "zeros")
... (skip)

# after
... (skip)
try:
    dtypes.check_user_dtype_supported(dtype, "astype")
except:
    dtype = dtypes.bfloat16
... (skip)
try:
    dtypes.check_user_dtype_supported(dtype, "astype")
except:
    dtype = dtypes.bfloat16
... (skip)
try:
    dtypes.check_user_dtype_supported(dtype, "asarray")
except:
    dtype = dtypes.bfloat16
... (skip)
try:
    dtypes.check_user_dtype_supported(dtype, "array")
except:
    dtype = dtypes.bfloat16
.. (skip)
try:
    dtypes.check_user_dtype_supported(dtype, "zeros")
except:
    dtype = dtypes.bfloat16
... (skip)

 

단계 10. 다음 파일을 root directory인 / 에도 복사하기

 checkpoint_10999999 

 geometry.757.model 

 geometry.757.vocab 

단계 11. 이제 alphageometry 모드로 AlphaGeometry를 실행할 수 있음

 

python -m alphageometry \
--alsologtostderr \
--problems_file=$(pwd)/imo_ag_30.txt \
--problem_name=translated_imo_2000_p6 \
--mode=alphageometry \
"./defs.txt" \
"${SEARCH_ARGS[@]}" \
"${LM_ARGS[@]}"

 

트러블슈팅 : TypeError: cannot unpack non-iterable Point object

해결 방법 : nano {path_to_numericals}/numericals.py 후 다음과 같이 수정 

 

# before
def check_cyclic(points: list[Point]) -> bool:
  points = list(set(points))
  (a, b, c), *ps = points
  circle = Circle(p1=a, p2=b, p3=c)
  for d in ps:
    if not close_enough(d.distance(circle.center), circle.radius):
      return False
  return True
  
# after  
def check_cyclic(points: list[Point]) -> bool:
  try:
    points = list(set(points))
    (a, b, c), *ps = points
    circle = Circle(p1=a, p2=b, p3=c)
    for d in ps:
      if not close_enough(d.distance(circle.center), circle.radius):
        return False
  except:
    False
  return True

 

입력: 2024.05.05 22:23