본문 바로가기
IT

구글 드라이브에 Academic Torrents의 토렌트 파일 다운로드 받는 방법 feat. 구글 코랩 (Colab)

by dino_think 2022. 12. 31.

 

머신러닝, 그 중에서도 딥러닝 (deep learning) 기반 모델들을 학습하기 위해서는 대용량의 학습자료가 필요한 시대입니다. 특히, 논문을 목적으로 기존 연구와의 비교 평가를 위해 벤치마크 (benchmark) 데이터셋이 필요한데요, 벤치마크 데이터셋을 제공하는 곳에서 다운로드 받을 때 속도가 너무 느린 경우가 있습니다. 이를 위해, 토렌트로 빠르게 연구자료를 다운로드 받을 수 있는 Academic Torrents라는 비영리 사이트가 2013년에 개설되었죠. 2022년 12월 31일 기준 약 127TB의 연구용 데이터가 업로드 되어 있습니다. 아마 논문에서 흔히 보이는 벤치마크 데이터셋은 모두 존재하지 않을까 생각됩니다. Academic Torrents에 대해 조금 더 자세히 알고 싶으시다면 위키피디아에 검색해보셔도 좋습니다. 

 

 

갑자기 Academic Torrents를 왜 소개하지? 라고 의아하게 생각 하실텐데요, Academic Torrents의 토렌트 파일을 구글 코랩 (Colab)을 이용해서 구글 드라이브에 저장하는 방법을 소개 해드리려고 합니다. 요즘은 인터넷에 연결할 수 있는 환경이라면 어디서나 구글 코랩으로 간단하게 모델을 학습해보거나, 이미 학습된 모델을 다운로드 받아서 테스트 해보거나, 정말 다양하게 활용되고 있습니다. 벤치마크 데이터셋을 제공하는 곳에서 구글 코랩에 바로 다운로드 받을 수도 있지만, 속도가 느린 경우가 있습니다. 구글 코랩은 사용자가 더이상 사용을 안한다고 판단되면, 런타임 연결을 해제시킵니다. 저도 초반에 구글 코랩으로 대용량 데이터셋을 다운로드 걸어두고, 밥 먹고 돌아왔더니 런타임 연결이 해제되서 다운로드가 중단된 적도 있었습니다 ㅠㅠ 

 

 

그래서 보통 구글 드라이브에 데이터셋을 미리 업로드 해두고, 구글 코랩을 구글 드라이브와 연결해서 데이터셋을 불러오는 방법을 취합니다. 물론 데이터셋을 구글 드라이브에 업로드할 때도 시간이 많이 소요됩니다. 하지만 Academic Torrents에서 제공하는 토렌트 파일을 사용하면, 구글 드라이브에 빠르게 데이터셋을 다운로드 받을 수 있다고 생각합니다. 생각해보니 서론이 길었네요 ㅎㅎ 빨리 본론으로 넘어가겠습니다. 

 

 

우선 Academic Torrents에 접속합니다. MNIST를 이용해서 설명을 드릴 예정인데요, 아래 <사진 1>과 같은 Academic Torrents 홈페이지에서 붉은색 네모 박스 안에 "MNIST"를 입력 후 엔터를 입력합니다. 

 

<사진 1> Academic Torrents 홈페이지 

 

다양한 결과가 검색되었는데요, 여기서 2014-10-14 에 업로드된 "MNIST Database"를 클릭합니다 (붉은색 네모 박스). Yann LeCun의 MNIST URL과 논문도 refer되어 있는 공식 데이터입니다. 

 

<사진 2> Academic Torrents 홈페이지에서 MNIST 검색한 화면

 

그러면 아래 <사진 3>과 같은 화면을 확인하실 수 있습니다. 여기서 붉은색 네모 박스 안의 자석 모양 아이콘을 오른쪽 클릭 후, 링크 주소 복사를 눌러주세요. 이게 마그넷 정보입니다. 복사된 마그넷 정보를 메모장이나 다른 곳에 붙여넣기 해줍니다. 나중에 구글 코랩에서 사용할 예정입니다. 이 붉은색 네모 박스의 오른쪽에 Download 아이콘이 있는데요, 이걸 누르게 되면 확장자 torrent 파일을 다운받습니다. 저희는 구글 코랩에서 마그넷 정보를 가지고 데이터를 다운받을 예정이니까, torrent 파일은 필요하지 않습니다. 

 

<사진 3> MNIST Database 화면

 

이제 구글 코랩에 접속해볼까요? 구글 코랩은 구글에 로그인한 상태에서 "google colab"을 검색하시면 쉽게 찾아보실 수 있습니다. 이제 아래 <사진 4>와 같은 메뉴창이 보이실텐데요, 여기서 붉은색 네모 박스로 표시된 "연결"을 눌러주세요. 참고로 제 구글 코랩 파일 이름은 test.ipynb 이지만, 파일명은 원하시는 걸로 만들어주시면 됩니다. 

 

<사진 4> 구글 코랩 (Google Colab) 접속 화면 

 

연결이 되셨다면 아래 <사진 5>와 같이 바뀐 것을 확인할 수 있습니다. 여기서 두번째 붉은색 네모 박스로 표시된 "+ 코드" 버튼을 눌러주세요. 그리고 아래 코드를 입력후, 왼쪽의 세번째 붉은색 네모 박스 안을 클릭해주세요. 이건 지금 작성한 코드를 실행한다는 의미인데요, 아래 코드는 로그인된 구글 계정에서 갖고 있는 구글 드라이브를 현재 구글 코랩과 연결 (mount) 시키는 코드입니다. 

 

from google.colab import drive 
drive.mount('/content/drive')

 

<사진 5> 구글 코랩 (Google Colab)에서 구글 드라이브 (Google Drive) 연결하는 화면 

 

실행이 완료되면 아래 <사진 6>의 첫번째 붉은색 박스와 같은 표시가 나타날텐데요, 다시 "+ 코드" 버튼을 누르고 (두번째 붉은색 네모 박스), 아래 코드를 입력합니다. 그리고 세번째 붉은색 네모 박스를 눌러서 실행시켜주세요. 이 코드의 목적은 python3-libtorrent 를 설치하는 것인데요, libtorrent는 간단하게만 말하면 C++ 기반 bittorrent 입니다. 이걸 파이썬으로 바인딩해서 나온 패키지가 python3-libtorrent 입니다. 지금 하려는 것은 구글 코랩으로 MNIST 토렌트 파일을 받아서, 구글 드라이브로 전송하는 것이므로, 구글 코랩에 토렌트를 다운로드 받을 수 있는 패키지가 설치되어야 합니다.

 

!python -m pip install --upgrade pip setuptools wheel
!python -m pip install lbry-libtorrent
!apt install python3-libtorrent

 

<사진 6> 구글 코랩 (Google Colab)에 python3-libtorrent 설치 화면 

 

이제 MNIST 토렌트를 다운로드 받기 위한 파이썬 파일을 생성합니다. 사실 구글 코랩에서 "+ 코드" 버튼을 누르고 파이썬 코드를 작성한 다음 실행시켜도 동작하는데요, 파이썬 파일을 구지 따로 생성하는 이유는 뒤쪽에서 설명드리겠습니다. 우선 아래 <사진 7>과 같이, 첫번째 붉은색 박스로 표시된 폴더 모양 버튼을 클릭해서 생성된 화면의 빈 공간에 마우스 오른쪽 클릭을 누른 다음, 두번째 붉은색 박스로 표시된 "새 파일"을 클릭합니다. 

 

<사진 7> 구글 코랩 (Google Colab)에 "새 파일" 생성 화면 

 

그러면 아래 <사진 8>과 같이, 첫번째 붉은색 박스로 표시된 것처럼 파일이 하나 생성된 것을 확인할 수 있는데요, 생성된 파일을 오른쪽 클릭해서 "파일 이름 바꾸기"를 클릭합니다 (두번째 붉은색 박스). 그리고 test.py 라고 입력합니다. 확장자가 py 라면 어떤 이름이든지 상관없습니다. 이렇게 하면 파이썬 파일이 생성되었습니다. 이걸 더블 클릭해줍니다.

 

<사진 8> 구글 코랩 (Google Colab)에 "파일 이름 바꾸기" 화면 

 

이제 아래 <사진 9>와 같이, 오른쪽에 "test,py" 탭이 표시되면서 아무 내용도 없는 화면을 보실텐데요, 여기다가 아래 파이썬 코드를 그대로 작성합니다. 이 때, 8번째 줄의 link라는 변수 옆 쌍따옴표 2개 사이에 방금 전 MNIST의 토렌트 마그넷 링크를 붙여넣기 합니다. 붙여넣기까지 완료 되었다면, 키보드의 Ctrl 키를 누른 상태에서 S 키를 눌러주세요 (Ctrl+S). 그리고 붉은색 네모 박스가 표시된 "노트북"을 클릭합니다. 

 

import libtorrent as lt
import time
import datetime

ses = lt.session()
ses.listen_on(6881, 6891)
params = {'save_path': '/content/drive/MyDrive'} # 파일이 다운로드 될 구글 드라이브 메인 디렉토리 경로
link = "토렌트 마그넷 링크를 이곳에 붙여넣기" 
 
handle = lt.add_magnet_uri(ses, link, params)
ses.start_dht()

print ('Downloading Metadata...')
while (not handle.has_metadata()):
    time.sleep(1)
print ('Got Metadata, Starting Torrent Download...')

print("Starting", handle.name())

while (handle.status().state != lt.torrent_status.seeding):
    s = handle.status()

print(handle.name(), "COMPLETE") # 다운로드 완료되면 "COMPLETE" 출력 후 종료

 

<사진 9> 생성된 파이썬 파일의 화면

 

이제 다시 아래 <사진 10>의 첫번째 붉은색 박스로 표시된 "+ 코드" 버튼을 클릭 후, 아래 코드를 입력하고 실행버튼을 클릭합니다. 이 코드는 백그라운드로 test.py를 실행하고, 여기서 발생되는 모든 로그를 log.txt 파일에 저장하겠다는 의미입니다. 이렇게 백그라운드로 실행하면 런타임 연결이 끊어져도 계속 토렌트로 다운로드를 실행하기 위함입니다. 물론 나중에 이 방법의 단점에 대해서도 알아보겠지만, 이렇게 백그라운드로 실행을 해도 너무 오랜 시간이 흐르면 세션이 중단되긴 합니다 ^^;

 

!nohup /usr/bin/python3 test.py > log.txt 2>&1 &

 

<사진 10> nohup 명령어 입력 화면 

 

그리고 다시 첫번째 붉은색 박스로 표시된 "+ 코드" 버튼을 클릭해서, 아래 코드를 입력 후 실행 버튼을 클릭합니다. 그러면 아래 <사진11>과 같은 화면이 보이실텐데요, 여기서 두번째 붉은색 박스로 표시된 부분을 클릭하고, "ps -ef"를 입력합니다. 그러면 현재 실행되고 있는 프로세스 목록이 보이실텐데요, 여기서 세번째 붉은색 박스와 같이, test.py 가 실행 중임을 알 수 있습니다. !bash 를 실행하면, ps -ef 대신 exit 를 입력할 때까지 계속 bash가 실행되는데요, 이렇게 해두면 구글 코랩에서는 당분간 계속 사용 중으로 인식하게 됩니다. 물론 너무 오랫동안 아무 작업도 하지 않으면 세션이 셧다운 되더라구요. 그래서 저는 주기적으로 ps -ef 를 입력해서 진행상태를 확인해줍니다. 

 

!bash
ps -ef
exit

 

<사진 11> ps -ef 입력한 화면 (다운로드 중)

 

다운로드가 완료되면, ps -ef 를 입력했을 때 아래 <사진 10>과 같이, test.py 관련 프로세스가 보이지 않는 것을 확인할 수 있습니다. 그리고 구글 드라이브에도 파일이 다운로드 되어 있는 것을 확인할 수 있습니다.

 

<사진 12> ps -ef 입력한 화면 (다운로드 완료)

 

<사진 13> MNIST가 다운로드 된 구글 드라이브 화면

 

지금까지 설명드린 방법은 크게 두 가지 문제점이 있습니다. 첫번째는 구글 코랩이다보니, bash 명령어를 실행시켜도 오랜 시간동안 아무런 작업도 하지 않고 그대로 놔두면 자동으로 세션이 중단되는 문제가 있습니다. 그래서 가끔식 수동으로 bash 명령어가 실행된 상태에서 ps -ef 로 프로세스 업데이트 현황을 체크해줘야 해서 귀찮습니다. 

 

두번째는 구글 코렙을 사용할 때의 무료 용량이 2022년 12월 31일 기준 약 84GB 제공되고 있는데요, 이 무료 용량보다 더 큰 용량의 데이터셋을 다운로드 받을 수 없습니다. 이 부분은 저의 추측이지만, 구글 코렙에 데이터를 받아두었다가, 다운로드가 끝났을 때 구글 드라이브로 옮겨가기 때문이 아닐까 생각됩니다. 왜냐하면, 무료 용량보다 더 큰 크기의 데이터셋에 대해서 다운로드 했을 때 용량 부족 경고 메세지를 봤었거든요. 이 부분을 고려해서 무료 용량보다 약 10% 적은 용량 또는 이것보다 적은 용량의 데이터셋에 대해서만 실행해보시는 것을 권장드립니다.

 

 

지금까지 구글 코랩을 이용해서 구글 드라이브에 Academic Torrents의 토렌트 파일을 다운로드 받는 방법에 대해 알아보았습니다. 구글 코랩으로 Academic Torrents의 토렌트 파일을 다운로드 받는 더 효율적인 방법이 있다면 꼭 업데이트 해두겠습니다.

 

댓글