PyO3로 Rust code에서 Python module 사용하기

PyO3를 이용하면 Rust에서 Python을 호출하거나 반대로 Python에서 Rust를 호출하는 바인딩을 구현할 수 있다. 이 포스팅에서는 예전에 해봤던 Datumaro로 데이터셋을 detect하는 Python함수를 Rust로 호출하는 예제를 구현해 본다.

Python 의존설 설치

Python 관련한 의존성은 예전과 같이 Datumaro를 사용하는데 필요한 것들을 설치해 준다.

pip install 'datumaro[tf,tfds]' \
   tensorboardX \
   tensorflow-dataset \
   importlib_resources \
   nibabel

Rust 의존성 crates 설정

다음과 같은 crate들이 필요하다.

  • pyo3: PyO3 라이브러리
  • shellexpand: ~를 절대경로로 변환하는데 사용
  • tempfile: 압축 파일을 해제 해둘 임시공간 생성
  • zip, tar, flate2: 압축해제
cargo add pyo3 shellexpand tempfile zip tar flate2 

Rust 구현 코드

실행결과

Rust Debug – 10.9초

구현이 끝나고 돌려 봤을 때 조금 전다는 느낌이 있기는 했지만 모든 데이터셋들을 압축해제 하고 detect하는데 대략 10.9초 정도가 걸렸다.

Python vs. Rust Release

반면 Python은 3.5초 정도면 동일한 동작이 끝난다.

역시 바인딩을 위한 중간 레이어에서 뭘 많이 잡아 먹는 것일까? 하고 생각하다가 release 모드로 돌려 봤더니 결과가 확연히 좋아져서 2.5초 정도로 개선되었다.

Rust의 디버그 모드와 릴리즈 모드의 차이가 생각보다 크게 난다.

Datumaro를 이용한 dataset format 확인

Datumaro는 Intel에서 Opensource로 배포하는 Dataset 관리를 위한 프레임 워크이다. Dataset 간의 변환 등의 다양한 기능을 제공하는데, 이를 이용하면 주어진 dataset이 어떤 포맷인지도 쉽게 알 수 있기에 유용하다. 이 포스팅에서는 Datumaro를 설정하고 dataset의 포맷을 확인하는 방법을 알아본다.

Dependencies

이 포스팅에서는 datumaro에 포함된 datum의 dataset download 기능을 이용해서 다양한 형식의 dataset을 download 받을 수 있었는데, 이를 이용하려면 다음의 의존성이 만족해야 한다.

pip install 'datumaro[tf,tfds]' \
   tensorboardX \
   tensorflow-dataset \
   importlib_resources \
   nibabel

tfds는 TensorFlow project에서 관리하는 dataset 컬렉션이고 여기에서 곧바로 다운로드를 받아 올 수 있다. 문서 상에는 Kaggle도 지원하는 것처럼 되어 있기는 한데, 실제로는 다운로드 되지 않았다(Jul 2026 현재).

Dataset Download

의존성 설치가 완료된 다음에는 datum 명령어를 이용해서 다운로드 가능한 dataset의 목록을 볼 수 있다.

datum download tfds describe --report-format json

위의 예제 명령줄은 tfds로 부터 목록을 받아오는 것이며 전술 했듯, 현재 시점에서 kaggle은 아무 내용도 보여 주지 않는다.

출력되는 결과에는 dataset의 이름과 그것에 대한 세부 사항들이 표시되는데, 특정한 dataset을 받기 위해서는 datum downloadget 명령어를 사용하면 된다. 예를 들어 다운로드 받은 항목이 다음과 같이 표시되었다고 하면,

{
  "tfds:cifar10": {
    "default_output_format": "cifar",
    "description": "The CIFAR-10 dataset consists of 60000 32x32 colour images in 10 classes, with 6000 images per class. There are 50000 training images and 10000 test images.",
    "download_size": 170052171,
    "home_url": "https://www.tensorflow.org/datasets/catalog/cifar10",
    "human_name": "CIFAR-10",
    "num_classes": 10,
    "version": "3.0.2",
    "subsets": {
      "train": {
        "num_items": 50000
      },
      "test": {
        "num_items": 10000
      }
    }
  },
...
}

이 데이터셋 “tfds:cifar10”을 다운로드 받기 위해 dataset의 id를 명시해서 다음의 명령어를 수행하면 된다.

mkdir -p ~/Downloads/dataset
datum download tfds get -i tfds:cifar10 -o ~/Downloads/dataset/cifar10

Dataset format detection 예제

특정한 dataset의 형식을 알고자 한다면 datumaro.Dataset.detect() method의 path parameter에 dataset의 root directory를 넘겨주면 어떤 형식인지 str로 반환해 준다.

내 경우, dataset을 압축 포맷으로 저장해 두는 경우가 많아서, 압축파일을 임시 디렉토리에 풀고 해당 dataset의 format을 검사해서 출력하도록 작성했다.

실행결과

현재 다운로드가 가능한 tfds의 모든 format들과 내가 가지고 있던 dataset들의 format을 잘 detect 해 주었다. 다만, voc_2012 dataset은 하나 이상의 format으로 매치 되는 MultipleFormatsMatchError가 올려지고 있어서 이 경우에 대한 부가적인 처리가 필요할 것 같다. 예제 에서는 그냥 중복 매칭된 포맷들의 목록을 출력해 주었다.

두 번째로 가보는 일본 출장 로그(30 Jun – 4 Jul 2026)

2년 전의 출장은 하네다 공항으로 가는 비행편이 없어 나리타 공항으로 예매를 했었는데, 도심에서 한참이나 떨어져 있어서 이동하는데 시간이 꽤나 걸렸었다. 이번에는 하네다 공항편으로 예매를 했더니 김포공항 출발편이어서 이동하기도 비교적 수월하고 도착해서도 이동에 많은 시간이 소요 되지는 않았다.

연예인과 함께하는 출국

김포공항 3층 출국장으로 오르는 길에 수많은 팬들이 누군가를 마중나와서 한참이나 기다리고있었다. ‘누구 대단한 사람 이라도 오나…’ 출국 수속을 마친다음 터미널 앞에서 기다리고 있었는데 어디 선가 굵은 목소리의 남자들이 “비켜요! 앞에 비켜!!” 외치면서 다가오고 있었다 그에 앞서서는 한 무리의 여자 사람 팬들이 웅성 거리면서 시진찍기 좋은 위치를 찾아 경쟁하며 뛰어들어왔다. 의자 밟고 올라서서 사진을 열심히 찍다가 왠 예쁘장한 남자 아이돌 무리가 나타나서는 비즈니스석 입구로 들어가자 아쉬운듯 그제야 카메라를 내려 놓았다.

그런데 터미널 안까지 들어 왔다는 건, 비행기표까지 끊어가면서 연예인을 따라다닌 다는 말이지 않는가. 게 중에는 비지니스석은 아니지만 마일리지 많은 사람들에게 주는 우선탑승객 사람들도 꽤나 있었는데 연예인을 따라다니면서 썼을 돈의 규묘를 짐작하게했다. 아무리 덕질에 돈이 든다고는 하지만…

나중에 인터넷 기사 검색을 해보니 아마도 그룹 투어스가 아니었나 싶다.

전시회 준비

협력회사 측에서 마중을 나와준 덕에 하네다공항에서 전시회장인 도쿄 빅사이트까지는 편하게 이동 할 수 있었다. 문제는 전시품의 배치와 연결 이었는데 사전에 사무실에서는 연결과 동작이 잘 되는지 확인만 한 정도였기 때문에 실제 전시회장에 들어오는 전선의 길이나 전시회 물품의 배치에 따른 연결은 고려되지 않았었다.

서버를 전시품 탁자 아래에 숨겨 놓고 220v 승압기 세대에 전시품들을 각각 연결하고, 유선랜을 배치하고 네트워크를 설정하는 작업을 하고 나니 어느새 저녁이 되었다.

유니콘 건담

설정을 마치고 호텔 체크인을 한 다음 저녁밥을 먹고 나서는 산책 삼아 걷다가 호텔에서 걸어서 30분정도 거리에 떨어져있는 유니콘 건담 실물 크기 상이 있다고 해서 구경하러 갔다.

낮에 보니까 이렇게 생겼더라

2일차 – 4일차

전시회 기간동안은 정신없이 지나 갔는데, 아침은 맥도날드, 저녁은 스키야 규동을 먹는 삶을 반복하며 정신없이 보냈다. 일본어를 할 줄 모르기 때문에 방문자가 찾아와도 할 수 있는게 없기는 했지만 데모 시스템이 이상동작 기미를 보일 때 마다 움직여 주거나 과열되지 않도록 보기 흉한 통풍구를 잠시 열어 둔다던가 가끔씩 영어로 소통이 가능한 사람이 있으면 설명하고 질문에 답하는 일을 했다. 의외로 한국에서 온 관람객들도 꽤나 있었는데, 데모에 관심을 보여서 명함을 교환하고 다시 연락하기로 했다.

전시장 뒷편에는 짬짬히 앉아서 쉴 수 있는 공간이 있는데, 관람객들이 없을 때는 여기에 들어가서 잠깐씩 쉬기도 했다. 그런데 꽤나 큰 행사여서 그런지 사실상 사람들이 없는 시간은 많지 않았다.

마지막날

온전히 편하게 쉴 수 있는 하루가 주어졌다. 뭘 해야 할까? 행사도 잘 끝나고 해체작업도 완료 했으니 이 날 하루는 마음 편하게 쉬는 것만 남았다.

그래도 아무것도 안하는 것은 좀 아니지 않나 싶어서 지하철로 40분 거리에 떨어져 있는 Shimbashi에 다녀 왔다. 점심 먹을 곳을 찾던 중 일본에서 유명하다고 들었던 이치란 라멘집이 있어서 가볼까 했더니 벌써 가게 밖까지 줄을 서고 있었다. 그 외에도 몇군데를 다녀봤는데 사람들이 가게 주변에 줄을 서 있는 곳이 많아서 마땅히 밥먹을 곳을 찾기가 쉽지 않았다.

저렇게 까지 해야 되나… 싶어하던 안일한 관광객의 점심은 편의점 라면이 되었다.

Bento Stand

나에게는 조금 특이하다고 생각되었던 것 중 하나가 여러 건물들에서 보이는 “Bento Stand”라는 것이었는데, 건물의 로비 혹은 한 층에 테이블과 한 두 사람이 앉을 수 있는 공간을 마련해 두고 다른 곳에서 사온 음식을 먹거나 간단하게 사무를 볼 수 있는 공간이 마련되어 있었다. 실제로 많은 사람들이 이곳에 앉아서 도시락을 먹고는 하는데 이름에서도 그렇듯이 아마도 일본의 도시락 문화와 관련한 배려가 아닐까 싶다.

도라에몽

호텔 근처에 도라에몽 케릭터에 관련한 전시물들이 여기저기에 있었는데 혹시 오다이바 지역이 도라에몽과 관련이 있는 지 일본인 지인에게 물어 봤더니. 아닐꺼라고 한다. 그냥 있는 것일 거라고…

유동인구도 별로 없는 이런곳에 이런 썰렁한 동상들을 왜 세워 놨을까 하던 의구심은 주말이 되자 바로 풀렸다. 어마어마 하게 많은 사람들이 이 지역을 찾고 도라에몽을 둘러싸고 사진을 찍으면서 가족 나들이 하는 모습을 보니 오다이바 지역을 왜 도심속 관광지라고들 하는지 알것 같았다.