Curieux.JY
  • JungYeon Lee
  • Post
  • Note

On this page

  • ๐Ÿš€ Introduction
  • ๐Ÿ“ฆ Conda Ecosystem ๊ตฌ์กฐ
    • ๐Ÿ”ฅ ํ•ต์‹ฌ ์งˆ๋ฌธ
  • โš–๏ธ Miniforge vs Default Conda
    • ๊ธฐ๋ณธ conda
    • Miniforge
  • ๐Ÿง  The Real Problem: ABI
    • ๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์ œ = ABI mismatch
    • ABI๋ž€?
    • ๐Ÿ’ฅ ABI mismatch๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด
  • ๐Ÿงจ ์‹ค์ œ ์˜ˆ (C++ ABI)
  • ๐Ÿ—๏ธ Why conda-forge Works
    • 1. Unified Toolchain
    • 2. Global Pinning
    • 3. Mass Rebuild
    • 4. run_exports
  • ๐Ÿ”— Linker Level Deep Dive
    • ๋ฌธ์ œ ์ƒํ™ฉ
    • ํ•ด๊ฒฐ: RPATH
  • โš ๏ธ defaults์—์„œ ๊นจ์ง€๋Š” ์ด์œ 
  • ๐Ÿงจ Real-world Failure
  • ๐Ÿค– Robotics / RL์—์„œ ๋” ์ค‘์š”ํ•œ ์ด์œ 
  • โœ… Best Practice
  • ๐Ÿ› ๏ธ Installation (Ubuntu 24.04)
    • 1. ๋‹ค์šด๋กœ๋“œ
    • 2. ์„ค์น˜
    • 3. ์ ์šฉ
    • 4. ํ™•์ธ
    • โš ๏ธ Notes
  • ๐Ÿงพ Final Takeaway
  • ๐Ÿ“Œ Final Recommendation
  • ๐Ÿ’ฌ Closing
  • Reference

๐Ÿ“Miniforge

miniforge
2026
Miniforge ์•Œ์•„๋ณด๊ธฐ
Published

March 20, 2026

๐Ÿš€ Introduction

conda๋ฅผ ์“ฐ๋ฉด์„œ ์ด๋Ÿฐ ๊ฒฝํ—˜ ํ•œ ๋ฒˆ์ฏค ์žˆ๋‹ค:

  • ์„ค์น˜๋Š” ๋๋Š”๋ฐ ์‹คํ–‰ํ•˜๋ฉด crash
  • segmentation fault
  • ํ™˜๊ฒฝ์ด ์žฌํ˜„์ด ์•ˆ๋จ

Stack Overflow๋ฅผ ๋’ค์ ธ๋ด๋„ ๋šœ๋ ทํ•œ ๋‹ต์ด ์•ˆ ๋‚˜์˜ค๊ณ , ํŒจํ‚ค์ง€๋ฅผ ์ง€์› ๋‹ค ๊น”์•˜๋‹ค ๋ฐ˜๋ณตํ•˜๋‹ค๊ฐ€ ๊ฒฐ๊ตญ ํ™˜๊ฒฝ ์ž์ฒด๋ฅผ ๋‚ ๋ ค๋ฒ„๋ฆฐ ๊ฒฝํ—˜. ์ด ๋ฌธ์ œ์˜ ๋ณธ์งˆ์€ ๋‹จ์ˆœํ•˜์ง€ ์•Š๋‹ค.

โ— ๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์ œ๋Š” Python์ด ์•„๋‹ˆ๋ผ ABI + linker ๋ฌธ์ œ

์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ โ€œconda๊ฐ€ ๊ผฌ์˜€๋‹คโ€๋ผ๊ณ  ํ‘œํ˜„ํ•˜๋Š” ํ˜„์ƒ์˜ ์ƒ๋‹น์ˆ˜๋Š” Python ๋ ˆ๋ฒจ์ด ์•„๋‹Œ ๊ทธ ์•„๋ž˜, C/C++ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ ˆ๋ฒจ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋‹ค. ์ด ๊ธ€์—์„œ๋Š”:

  • ์™œ Miniforge๊ฐ€ ๋” ์•ˆ์ •์ ์ธ์ง€
  • ABI / toolchain / linker ๋ ˆ๋ฒจ์—์„œ ๋ถ„์„
  • ์‹ค์ œ๋กœ ์™œ crash๊ฐ€ ๋‚˜๋Š”์ง€
  • ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐ๋˜๋Š”์ง€

๋ฅผ ๋‹จ๊ณ„์ ์œผ๋กœ ์„ค๋ช…ํ•œ๋‹ค.


๐Ÿ“ฆ Conda Ecosystem ๊ตฌ์กฐ

๋จผ์ € ๊ตฌ์กฐ๋ฅผ ์ •ํ™•ํžˆ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค. conda ์ƒํƒœ๊ณ„๋Š” ํฌ๊ฒŒ distribution(๋ฐฐํฌํŒ)๊ณผ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ๋‘ ๊ณ„์ธต์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

flowchart TD
    A[Miniforge / Anaconda] --> B[conda]
    B --> C[Environment]
    C --> D[Python + C++ libs]

๐Ÿ‘‰ ํ•ต์‹ฌ:

  • conda = ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €
  • Miniforge = distribution

ํ”ํžˆ conda์™€ Anaconda๋ฅผ ๋™์ผ์‹œํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€๋ฐ, conda๋Š” ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ณ  ํ™˜๊ฒฝ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋„๊ตฌ์ด๊ณ , Anaconda๋‚˜ Miniforge๋Š” ๊ทธ conda๋ฅผ ํฌํ•จํ•œ ๋ฐฐํฌํŒ์ด๋‹ค. ์–ด๋–ค ๋ฐฐํฌํŒ์„ ์“ฐ๋А๋ƒ์— ๋”ฐ๋ผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์–ด๋–ค ์ฑ„๋„(ํŒจํ‚ค์ง€ ์ €์žฅ์†Œ)์—์„œ ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”์ง€๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.


๐Ÿ”ฅ ํ•ต์‹ฌ ์งˆ๋ฌธ

์™œ ๊ฐ™์€ conda์ธ๋ฐ ํ™˜๊ฒฝ์ด ๊นจ์งˆ๊นŒ?

๐Ÿ‘‰ ๋‹ต:

ํŒจํ‚ค์ง€๋ฅผ ์–ด๋””์„œ ๊ฐ€์ ธ์˜ค๋Š”์ง€๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ

๊ฐ™์€ conda install numpy๋ผ๋„, defaults ์ฑ„๋„์—์„œ ๊ฐ€์ ธ์˜จ numpy์™€ conda-forge์—์„œ ๊ฐ€์ ธ์˜จ numpy๋Š” ๋นŒ๋“œ ํ™˜๊ฒฝ ์ž์ฒด๊ฐ€ ๋‹ค๋ฅด๋‹ค. ์ด ์ฐจ์ด๊ฐ€ ๋‹จ์ผ ํŒจํ‚ค์ง€์—์„œ๋Š” ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š์ง€๋งŒ, ์—ฌ๋Ÿฌ ํŒจํ‚ค์ง€๊ฐ€ ์„œ๋กœ ์˜์กดํ•˜๋ฉด์„œ ๊ฒฐํ•ฉ๋  ๋•Œ ๋ฌธ์ œ๊ฐ€ ํญ๋ฐœํ•œ๋‹ค.


โš–๏ธ Miniforge vs Default Conda

๊ธฐ๋ณธ conda

Anaconda๋‚˜ Miniconda๋ฅผ ์„ค์น˜ํ•˜๋ฉด ๊ธฐ๋ณธ์œผ๋กœ defaults ์ฑ„๋„์„ ์‚ฌ์šฉํ•œ๋‹ค.

  • ์ฑ„๋„: defaults

  • ํŠน์ง•:

    • ๋ณด์ˆ˜์ 
    • ์ผ๋ถ€ proprietary

Anaconda์‚ฌ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ์ด ์ฑ„๋„์€ ์•ˆ์ •์„ฑ์„ ์šฐ์„ ์‹œํ•˜์ง€๋งŒ, ํŒจํ‚ค์ง€ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋А๋ฆฌ๊ณ  ์ƒ์—…์  ์‚ฌ์šฉ ์‹œ ๋ผ์ด์„ ์Šค ์ œ์•ฝ์ด ์žˆ๋‹ค. ๋˜ํ•œ ๊ฐ ํŒจํ‚ค์ง€๊ฐ€ ๋ฐ˜๋“œ์‹œ ๋™์ผํ•œ ๋นŒ๋“œ ํ™˜๊ฒฝ์—์„œ ์ปดํŒŒ์ผ๋œ๋‹ค๋Š” ๋ณด์žฅ์ด ์—†๋‹ค.


Miniforge

Miniforge๋Š” conda-forge ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒฝ๋Ÿ‰ ๋ฐฐํฌํŒ์ด๋‹ค.

  • ์ฑ„๋„: conda-forge

  • ํŠน์ง•:

    • ์ตœ์‹  ํŒจํ‚ค์ง€
    • ์˜คํ”ˆ์†Œ์Šค
    • mamba ํฌํ•จ

conda-forge๋Š” ์ˆ˜์ฒœ ๋ช…์˜ ์ปจํŠธ๋ฆฌ๋ทฐํ„ฐ๊ฐ€ ์ฐธ์—ฌํ•˜๋Š” ์˜คํ”ˆ์†Œ์Šค ์ฑ„๋„๋กœ, ํŒจํ‚ค์ง€ ๋นŒ๋“œ์˜ ์ผ๊ด€์„ฑ์„ ์‹œ์Šคํ…œ์ ์œผ๋กœ ๋ณด์žฅํ•˜๋Š” ์ธํ”„๋ผ๋ฅผ ๊ฐ–์ถ”๊ณ  ์žˆ๋‹ค. ๋˜ํ•œ Miniforge์—๋Š” conda์˜ ๊ณ ์† ๋Œ€์ฒด์žฌ์ธ mamba๊ฐ€ ๊ธฐ๋ณธ ํƒ‘์žฌ๋˜์–ด ์žˆ์–ด ์˜์กด์„ฑ ํ•ด๊ฒฐ ์†๋„๊ฐ€ ์›”๋“ฑํžˆ ๋น ๋ฅด๋‹ค.

๐Ÿ‘‰ ์ค‘์š”ํ•œ ์ฐจ์ด:

ecosystem ์ž์ฒด๊ฐ€ ๋‹ค๋ฅด๋‹ค

๋‹จ์ˆœํžˆ โ€œ์–ด๋–ค installer๋ฅผ ์ผ๋А๋ƒโ€์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ, ํŒจํ‚ค์ง€๊ฐ€ ๋นŒ๋“œ๋˜๊ณ  ํ…Œ์ŠคํŠธ๋˜๊ณ  ๋ฐฐํฌ๋˜๋Š” ์ „์ฒด ํŒŒ์ดํ”„๋ผ์ธ์ด ๋‹ค๋ฅด๋‹ค๋Š” ๋œป์ด๋‹ค.


๐Ÿง  The Real Problem: ABI

๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์ œ = ABI mismatch

Python ํŒจํ‚ค์ง€ ์ƒ๋‹น์ˆ˜๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ C/C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜์กดํ•œ๋‹ค. numpy, scipy, pytorch, OpenCV ๋“ฑ ๊ณผํ•™ ๊ณ„์‚ฐ์ด๋‚˜ ๋”ฅ๋Ÿฌ๋‹์—์„œ ํ•ต์‹ฌ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํŒจํ‚ค์ง€๋“ค์ด ๋ชจ๋‘ ๊ทธ๋ ‡๋‹ค. ์ด ํŒจํ‚ค์ง€๋“ค์ด ์„œ๋กœ ๋‹ค๋ฅธ ๋ฒ„์ „์˜ C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋นŒ๋“œ๋˜๋ฉด ABI mismatch๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

flowchart LR
    A[Python package] --> B[C/C++ lib]
    B --> C[ABI mismatch]
    C --> D[Crash / Segfault]

ABI๋ž€?

ABI(Application Binary Interface)๋Š” ์ปดํŒŒ์ผ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋“ค์ด ์„œ๋กœ ์†Œํ†ตํ•˜๊ธฐ ์œ„ํ•œ ์ €์ˆ˜์ค€ ์•ฝ์†์ด๋‹ค. ์†Œ์Šค์ฝ”๋“œ ๋ ˆ๋ฒจ์˜ API์™€ ๋‹ฌ๋ฆฌ, ABI๋Š” ์ปดํŒŒ์ผ ์ดํ›„์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜ธํ™˜์„ฑ์„ ๋‹ค๋ฃฌ๋‹ค.

ABI = ๋ฐ”์ด๋„ˆ๋ฆฌ ๊ฐ„์˜ ์•ฝ์†

  • ํ•จ์ˆ˜ ์ด๋ฆ„ (symbol)
  • ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ
  • calling convention
  • libc / libstdc++ ๋ฒ„์ „

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ™์€ std::string์ด๋ผ๋„ ์ปดํŒŒ์ผ๋Ÿฌ ๋ฒ„์ „์ด๋‚˜ ๋นŒ๋“œ ์˜ต์…˜์— ๋”ฐ๋ผ ๋‚ด๋ถ€ ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์ด ์™„์ „ํžˆ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค. ์†Œ์Šค์ฝ”๋“œ๋Š” ๋™์ผํ•ด๋„ ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” ์„œ๋กœ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.


๐Ÿ’ฅ ABI mismatch๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด

์„ค์น˜ OK
import OK
์‹คํ–‰ โ†’ crash

๐Ÿ‘‰ ๊ฐ€์žฅ ๋””๋ฒ„๊น… ์–ด๋ ค์›€

์ด๊ฒŒ ABI ๋ฌธ์ œ์˜ ๊ฐ€์žฅ ์•…์งˆ์ ์ธ ํŠน์„ฑ์ด๋‹ค. ์„ค์น˜๋„ ๋˜๊ณ , import๋„ ๋˜๊ณ , ์‹ฌ์ง€์–ด ๊ฐ„๋‹จํ•œ ์—ฐ์‚ฐ๊นŒ์ง€๋Š” ์ž˜ ๋Œ์•„๊ฐ„๋‹ค. ํ•˜์ง€๋งŒ ํŠน์ • ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ฒฝ๋กœ๋ฅผ ํƒ€๋Š” ์ˆœ๊ฐ„ segfault๊ฐ€ ํ„ฐ์ง„๋‹ค. ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋„ ๋ถˆ์นœ์ ˆํ•˜๊ณ , Python traceback์œผ๋กœ๋Š” ์›์ธ์„ ์ถ”์ ํ•  ์ˆ˜ ์—†๋‹ค.


๐Ÿงจ ์‹ค์ œ ์˜ˆ (C++ ABI)

C++ ABI ๋ฌธ์ œ์˜ ๋Œ€ํ‘œ์ ์ธ ์‚ฌ๋ก€๋ฅผ ํ•˜๋‚˜ ์‚ดํŽด๋ณด์ž. ์•„๋ž˜์™€ ๊ฐ™์€ ๋‹จ์ˆœํ•œ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž:

std::string foo();

์ด ํ•จ์ˆ˜๋ฅผ ์ปดํŒŒ์ผํ•  ๋•Œ, GCC 5 ์ดํ›„๋กœ ๋„์ž…๋œ _GLIBCXX_USE_CXX11_ABI ํ”Œ๋ž˜๊ทธ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ€ ์™„์ „ํžˆ ๋‹ฌ๋ผ์ง„๋‹ค.

์ปดํŒŒ์ผ ์˜ต์…˜:

-D_GLIBCXX_USE_CXX11_ABI=0
vs
=1

๊ฒฐ๊ณผ:

_ZNSs...              (old ABI)
_ZNSt7__cxx11...      (new ABI)

๐Ÿ‘‰ linker ์ž…์žฅ:

โ€œ๋‹ค๋ฅธ ํ•จ์ˆ˜โ€

๊ฐ™์€ std::string foo()์ธ๋ฐ, mangled symbol์ด ์™„์ „ํžˆ ๋‹ค๋ฅด๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ A๋Š” old ABI๋กœ ๋นŒ๋“œํ•˜๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ B๋Š” new ABI๋กœ ๋นŒ๋“œํ–ˆ๋‹ค๋ฉด, ๋งํ‚น ๋‹จ๊ณ„์—์„œ โ€œundefined symbolโ€ ์—๋Ÿฌ๊ฐ€ ๋‚˜๊ฑฐ๋‚˜, ์šด์ด ๋‚˜์˜๋ฉด ๋งํ‚น์€ ์„ฑ๊ณตํ•˜๋˜ ๋Ÿฐํƒ€์ž„์— ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ ๋ถˆ์ผ์น˜๋กœ segfault๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.


๐Ÿ—๏ธ Why conda-forge Works

๊ทธ๋ ‡๋‹ค๋ฉด conda-forge๋Š” ์ด ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ• ๊นŒ? ํฌ๊ฒŒ ๋„ค ๊ฐ€์ง€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์žˆ๋‹ค.

1. Unified Toolchain

flowchart TD
    A[gcc] --> B[All packages]
    B --> C[Same ABI]

๐Ÿ‘‰ ๋ชจ๋“  ํŒจํ‚ค์ง€๊ฐ€ ๋™์ผ compiler๋กœ ๋นŒ๋“œ

conda-forge๋Š” ์ž์ฒด์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” compiler toolchain์„ ์‚ฌ์šฉํ•ด์„œ ๋ชจ๋“  ํŒจํ‚ค์ง€๋ฅผ ๋นŒ๋“œํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, conda-forge์—์„œ ๋นŒ๋“œ๋˜๋Š” ๋ชจ๋“  C++ ํŒจํ‚ค์ง€๋Š” ๊ฐ™์€ ๋ฒ„์ „์˜ GCC์™€ ๊ฐ™์€ _GLIBCXX_USE_CXX11_ABI ์„ค์ •์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๊ฒƒ๋งŒ์œผ๋กœ๋„ ABI mismatch์˜ ๋Œ€๋ถ€๋ถ„์ด ์›์ฒœ ์ฐจ๋‹จ๋œ๋‹ค.


2. Global Pinning

numpy = 1.26
python = 3.10

๐Ÿ‘‰ ecosystem ์ „์ฒด๊ฐ€ ๋งž์ถฐ์ง

conda-forge๋Š” conda-forge-pinning์ด๋ผ๋Š” ์ค‘์•™ ์„ค์ • ํŒŒ์ผ๋กœ ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฒ„์ „์„ ecosystem ์ „์ฒด์— ๊ฑธ์ณ ํ†ต์ผํ•œ๋‹ค. ํŠน์ • ์‹œ์ ์— conda-forge์—์„œ ๋นŒ๋“œ๋˜๋Š” ๋ชจ๋“  ํŒจํ‚ค์ง€๋Š” ๋™์ผํ•œ numpy ๋ฒ„์ „, ๋™์ผํ•œ Python ๋ฒ„์ „์— ๋งž์ถฐ์ง„๋‹ค. ๊ฐœ๋ณ„ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๊ฐ€ ์ œ๊ฐ๊ฐ ๋ฒ„์ „์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ƒํƒœ๊ณ„ ์ „์ฒด๊ฐ€ ํ•˜๋‚˜์˜ ๋ฒ„์ „ ์„ธํŠธ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.


3. Mass Rebuild

flowchart TD
    A[numpy update] --> B[scipy rebuild]
    B --> C[pytorch rebuild]

๐Ÿ‘‰ ABI propagation ํ•ด๊ฒฐ

ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: numpy, Python)์˜ ๋ฒ„์ „์ด ์˜ฌ๋ผ๊ฐ€๋ฉด, ๊ทธ์— ์˜์กดํ•˜๋Š” ์ˆ˜์ฒœ ๊ฐœ์˜ ํŒจํ‚ค์ง€๋ฅผ ์ผ๊ด„ ๋ฆฌ๋นŒ๋“œ(mass rebuild) ํ•œ๋‹ค. ์ด ๊ณผ์ •์„ ํ†ตํ•ด ABI ๋ณ€๊ฒฝ์ด ์ƒํƒœ๊ณ„ ์ „์ฒด์— ๊ท ์ผํ•˜๊ฒŒ ์ „ํŒŒ๋˜์–ด, โ€œA๋Š” ์ƒˆ ๋ฒ„์ „์ธ๋ฐ B๋Š” ์•„์ง ์˜› ๋ฒ„์ „โ€์ด๋ผ๋Š” ๋ถˆ์ผ์น˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.


4. run_exports

run_exports:
  - libpng

๐Ÿ‘‰ dependency ์ž๋™ ์ „ํŒŒ

run_exports๋Š” conda-forge์˜ ๋ ˆ์‹œํ”ผ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ, ๋นŒ๋“œ ํƒ€์ž„ ์˜์กด์„ฑ์ด ๋Ÿฐํƒ€์ž„์—๋„ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์ž๋™์œผ๋กœ ์„ ์–ธํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด libpng์„ ๋นŒ๋“œ ์‹œ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด, ํ•ด๋‹น ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ๋•Œ ํ˜ธํ™˜๋˜๋Š” libpng์ด ์ž๋™์œผ๋กœ ๋Ÿฐํƒ€์ž„ ์˜์กด์„ฑ์— ์ถ”๊ฐ€๋œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด โ€œ๋นŒ๋“œํ•  ๋•Œ ์“ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌโ€์™€ โ€œ์‹คํ–‰ํ•  ๋•Œ ๋กœ๋“œ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌโ€์˜ ๋ฒ„์ „ ๋ถˆ์ผ์น˜๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค.


๐Ÿ”— Linker Level Deep Dive

ํ•œ ๋‹จ๊ณ„ ๋” ๊นŠ์ด ๋“ค์–ด๊ฐ€๋ณด์ž. ์‹ค์ œ๋กœ ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ์‚ดํŽด๋ณธ๋‹ค.

๋ฌธ์ œ ์ƒํ™ฉ

ldd ๋ช…๋ น์–ด๋กœ ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ์„ ํ™•์ธํ•ด๋ณด๋ฉด, ์ผ๋ถ€๋Š” conda ํ™˜๊ฒฝ ๋‚ด๋ถ€์—์„œ, ์ผ๋ถ€๋Š” ์‹œ์Šคํ…œ์—์„œ ๋กœ๋“œ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

ldd binary
libstdc++ โ†’ conda
libc โ†’ system

๐Ÿ‘‰ ๋ฌธ์ œ:

ABI mismatch

conda ํ™˜๊ฒฝ ์•ˆ์˜ libstdc++์™€ ์‹œ์Šคํ…œ์˜ libc๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ABI๋ฅผ ๊ธฐ๋Œ€ํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ํ˜ผํ•ฉ ๋กœ๋”ฉ์€ ํŠนํžˆ CUDA๋‚˜ MKL ๊ฐ™์€ ๋ฌด๊ฑฐ์šด ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚จ๋‹ค.


ํ•ด๊ฒฐ: RPATH

flowchart TD
    A[Binary] --> B[$ORIGIN]
    B --> C[conda libs]

๐Ÿ‘‰ conda ๋‚ด๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์šฐ์„  ์‚ฌ์šฉ

conda-forge์—์„œ ๋นŒ๋“œ๋œ ํŒจํ‚ค์ง€๋“ค์€ RPATH(Runtime Library Search Path)๋ฅผ $ORIGIN ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค์ •ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฐ”์ด๋„ˆ๋ฆฌ ์‹คํ–‰ ์‹œ ์‹œ์Šคํ…œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋Œ€์‹  conda ํ™˜๊ฒฝ ๋‚ด๋ถ€์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ๋กœ๋“œํ•˜๊ฒŒ ๋˜์–ด, ์‹œ์Šคํ…œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ์ถฉ๋Œ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.


โš ๏ธ defaults์—์„œ ๊นจ์ง€๋Š” ์ด์œ 

๋ฐ˜๋ฉด defaults ์ฑ„๋„์—์„œ๋Š” ์ด๋Ÿฐ ์ผ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค:

flowchart TD
    A[Package A] --> B[gcc 9]
    C[Package B] --> D[gcc 11]
    B --> E[ABI mismatch]
    D --> E

๐Ÿ‘‰ toolchain ๋ถˆ์ผ์น˜

Package A๋Š” gcc 9๋กœ, Package B๋Š” gcc 11๋กœ ๋นŒ๋“œ๋˜๋ฉด, ๊ฐ๊ฐ์€ ์ž˜ ๋™์ž‘ํ•˜์ง€๋งŒ ๊ฐ™์€ ํ™˜๊ฒฝ์— ํ•จ๊ป˜ ์„ค์น˜ํ•˜๋Š” ์ˆœ๊ฐ„ ABI๊ฐ€ ์ถฉ๋Œํ•œ๋‹ค. defaults ์ฑ„๋„์—์„œ๋Š” ํŒจํ‚ค์ง€๋ณ„ ๋นŒ๋“œ ํ™˜๊ฒฝ์ด ํ†ต์ผ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์—ฌ์ง€๊ฐ€ conda-forge๋ณด๋‹ค ํ›จ์”ฌ ํฌ๋‹ค.


๐Ÿงจ Real-world Failure

์‹ค์ œ๋กœ ๊ฐ€์žฅ ํ”ํ•˜๊ฒŒ ๋งˆ์ฃผ์น˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค ํ•˜๋‚˜๋ฅผ ๋ณด์ž:

conda install pytorch -c pytorch
conda install scipy

์ฒซ ๋ฒˆ์งธ ๋ช…๋ น์€ PyTorch ๊ณต์‹ ์ฑ„๋„์—์„œ, ๋‘ ๋ฒˆ์งธ๋Š” defaults ์ฑ„๋„์—์„œ ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ์ด ๋‘ ์ฑ„๋„์˜ ํŒจํ‚ค์ง€๋Š” ์„œ๋กœ ๋‹ค๋ฅธ toolchain์œผ๋กœ ๋นŒ๋“œ๋˜์—ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.

๊ฒฐ๊ณผ:

  • OpenMP ์ถฉ๋Œ
  • libstdc++ mismatch
  • segfault

ํŠนํžˆ OpenMP ๊ด€๋ จ ์ถฉ๋Œ์ด ์•…๋ช… ๋†’๋‹ค. PyTorch๋Š” ์ž์ฒด OpenMP๋ฅผ ๋ฒˆ๋“คํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ณ , scipy๋‚˜ numpy๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” OpenMP์™€ ์‹ฌ๋ณผ์ด ๊ฒน์น˜๋ฉด์„œ ๋Ÿฐํƒ€์ž„์— ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ๋™์ž‘์„ ์ผ์œผํ‚จ๋‹ค.


๐Ÿค– Robotics / RL์—์„œ ๋” ์ค‘์š”ํ•œ ์ด์œ 

๋กœ๋ณดํ‹ฑ์Šค๋‚˜ ๊ฐ•ํ™”ํ•™์Šต ๋ถ„์•ผ์—์„œ๋Š” ์ด ๋ฌธ์ œ๊ฐ€ ํŠนํžˆ ์น˜๋ช…์ ์ด๋‹ค. ์ผ๋ฐ˜์ ์ธ ๋ฐ์ดํ„ฐ ๋ถ„์„๊ณผ ๋‹ฌ๋ฆฌ, ์ด ๋ถ„์•ผ์˜ ์†Œํ”„ํŠธ์›จ์–ด ์Šคํƒ์€ ์—ฌ๋Ÿฌ ๊ณ„์ธต์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค.

flowchart TD
    A[Python] --> B[C++]
    B --> C[CUDA]
    C --> D[GPU runtime]

๐Ÿ‘‰ ๋ณต์žก๋„ โ†‘

Python์—์„œ ์‹œ์ž‘ํ•ด C++ ๋ฐ”์ธ๋”ฉ์„ ๊ฑฐ์น˜๊ณ , CUDA ์ปค๋„์„ ํ˜ธ์ถœํ•˜๊ณ , GPU ๋Ÿฐํƒ€์ž„๊นŒ์ง€ ๋‚ด๋ ค๊ฐ€๋Š” ์ด ๊ธด ์ฒด์ธ์—์„œ, ์–ด๋А ํ•œ ์ง€์ ์ด๋ผ๋„ ABI๊ฐ€ ๋งž์ง€ ์•Š์œผ๋ฉด ์ „์ฒด๊ฐ€ ๋ฌด๋„ˆ์ง„๋‹ค.

๐Ÿ‘‰ ABI ๊นจ์ง€๋ฉด:

  • simulation crash
  • NaN
  • ํ•™์Šต ์‹คํŒจ

ํŠนํžˆ NaN์ด ์กฐ์šฉํžˆ ํผ์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๊ฐ€์žฅ ์œ„ํ—˜ํ•˜๋‹ค. crash๋Š” ๊ทธ๋‚˜๋งˆ ๋ฐœ๊ฒฌ์ด ๋˜์ง€๋งŒ, ABI ๋ถˆ์ผ์น˜๋กœ ์ธํ•œ ๋ฏธ๋ฌ˜ํ•œ ์ˆ˜์น˜ ์˜ค๋ฅ˜๋Š” ํ•™์Šต์ด ํ•œ์ฐธ ์ง„ํ–‰๋œ ํ›„์—์•ผ ๋ฐœ๊ฒฌ๋˜๊ธฐ๋„ ํ•œ๋‹ค.


โœ… Best Practice

Miniforge๋ฅผ ์„ค์น˜ํ•œ ํ›„, ์•„๋ž˜ ์„ค์ •์œผ๋กœ conda-forge๋ฅผ ๊ธฐ๋ณธ ์ฑ„๋„๋กœ ๊ณ ์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

conda config --add channels conda-forge
conda config --set channel_priority strict

channel_priority strict์€ conda-forge์— ์žˆ๋Š” ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์œผ๋ฉด ๋ฌด์กฐ๊ฑด ๊ฑฐ๊ธฐ์„œ ๊ฐ€์ ธ์˜ค๋„๋ก ๊ฐ•์ œํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฑ„๋„ ๊ฐ„ ํ˜ผํ•ฉ์œผ๋กœ ์ธํ•œ ABI ๋ฌธ์ œ๋ฅผ ์›์ฒœ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ™˜๊ฒฝ ์ƒ์„ฑ ์‹œ์—๋Š” mamba๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์˜์กด์„ฑ ํ•ด๊ฒฐ์ด ํ›จ์”ฌ ๋น ๋ฅด๋‹ค.

mamba create -n rl python=3.10

๐Ÿ› ๏ธ Installation (Ubuntu 24.04)

1. ๋‹ค์šด๋กœ๋“œ

curl -L -O "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh"

๐Ÿ‘‰ ๊ณต์‹ installer ๋ฐฉ์‹ (Ask Ubuntu)

uname๊ณผ uname -m์„ ์‚ฌ์šฉํ•ด ํ˜„์žฌ OS์™€ ์•„ํ‚คํ…์ฒ˜์— ๋งž๋Š” installer๋ฅผ ์ž๋™์œผ๋กœ ์„ ํƒํ•œ๋‹ค. ARM(aarch64) ํ™˜๊ฒฝ์—์„œ๋„ ๋™์ผํ•œ ๋ช…๋ น์–ด๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.


2. ์„ค์น˜

bash Miniforge3-$(uname)-$(uname -m).sh

์„ค์น˜ ๊ณผ์ •์—์„œ ๋ผ์ด์„ ์Šค ๋™์˜, ์„ค์น˜ ๊ฒฝ๋กœ ์ง€์ • ๋“ฑ์˜ ์งˆ๋ฌธ์ด ๋‚˜์˜จ๋‹ค.

  • conda init โ†’ YES (NETL Multiphase Flow Science)

conda init์„ YES๋กœ ์„ ํƒํ•˜๋ฉด ์…ธ ์„ค์ • ํŒŒ์ผ(.bashrc ๋“ฑ)์— conda ์ดˆ๊ธฐํ™” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋˜์–ด, ํ„ฐ๋ฏธ๋„์„ ์—ด ๋•Œ๋งˆ๋‹ค conda๊ฐ€ ํ™œ์„ฑํ™”๋œ๋‹ค.


3. ์ ์šฉ

source ~/.bashrc

์„ค์น˜ ์งํ›„์—๋Š” ์…ธ์„ ์žฌ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ ์œ„ ๋ช…๋ น์–ด๋กœ ์„ค์ •์„ ๋ฐ˜์˜ํ•ด์•ผ conda ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


4. ํ™•์ธ

conda --version
mamba --version

๋‘ ๋ช…๋ น์–ด ๋ชจ๋‘ ๋ฒ„์ „์ด ์ถœ๋ ฅ๋˜๋ฉด ์„ค์น˜๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋œ ๊ฒƒ์ด๋‹ค.


โš ๏ธ Notes

  • Mambaforge deprecated (2024 ์ดํ›„) (GitHub)
  • Miniforge ๊ถŒ์žฅ

๊ณผ๊ฑฐ์—๋Š” mamba๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„์˜ Mambaforge๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ–ˆ์ง€๋งŒ, 2024๋…„๋ถ€ํ„ฐ Miniforge์— mamba๊ฐ€ ๊ธฐ๋ณธ ํฌํ•จ๋˜๋ฉด์„œ Mambaforge๋Š” ๋” ์ด์ƒ ์œ ์ง€๋˜์ง€ ์•Š๋Š”๋‹ค. ์‹ ๊ทœ ์„ค์น˜ ์‹œ์—๋Š” ๋ฐ˜๋“œ์‹œ Miniforge๋ฅผ ์‚ฌ์šฉํ•˜์ž.


๐Ÿงพ Final Takeaway

์ด ๊ธ€์˜ ํ•ต์‹ฌ:

Miniforge๋Š” ๋‹จ์ˆœํ•œ installer๊ฐ€ ์•„๋‹ˆ๋ผ ABI๊ฐ€ ํ†ต์ œ๋œ binary ecosystem์ด๋‹ค

conda-forge์˜ unified toolchain, global pinning, mass rebuild, run_exports ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๊ฒฐํ•ฉ๋˜์–ด, ์ˆ˜์ฒœ ๊ฐœ์˜ ํŒจํ‚ค์ง€๊ฐ€ ํ•˜๋‚˜์˜ ์ผ๊ด€๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ™˜๊ฒฝ์„ ์ด๋ฃจ๊ฒŒ ๋œ๋‹ค. ์ด๊ฒƒ์ด โ€œ๊ทธ๋ƒฅ ์ž˜ ๋˜๋Š”โ€ ํ™˜๊ฒฝ์˜ ๋น„๋ฐ€์ด๋‹ค.


๐Ÿ“Œ Final Recommendation

Miniforge + conda-forge + mamba

์ด ์„ธ ๊ฐ€์ง€ ์กฐํ•ฉ์ด๋ฉด ๋Œ€๋ถ€๋ถ„์˜ Python ๊ณผํ•™ ๊ณ„์‚ฐ, ๋”ฅ๋Ÿฌ๋‹, ๋กœ๋ณดํ‹ฑ์Šค ํ™˜๊ฒฝ์„ ์•ˆ์ •์ ์œผ๋กœ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ’ฌ Closing

conda์—์„œ ๊ฒช๋Š” ์ด์ƒํ•œ ๋ฌธ์ œ๋“ค์€ ๋Œ€๋ถ€๋ถ„:

๐Ÿ‘‰ ์ฝ”๋“œ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ๐Ÿ‘‰ ABI ๋ฌธ์ œ๋‹ค

๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ฌธ์ œ๋Š”:

Miniforge๋กœ ๋Œ€๋ถ€๋ถ„ ํ•ด๊ฒฐ๋œ๋‹ค

๋‹ค์Œ์— conda ํ™˜๊ฒฝ์—์„œ ์›์ธ ๋ชจ๋ฅผ crash๋ฅผ ๋งŒ๋‚˜๋ฉด, ํŒจํ‚ค์ง€๋ฅผ ์˜์‹ฌํ•˜๊ธฐ ์ „์— ๋จผ์ € ์–ด๋–ค ์ฑ„๋„์—์„œ ์„ค์น˜ํ–ˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

Reference

  • https://mamba.readthedocs.io/en/latest/installation/mamba-installation.html#fresh-install-recommended

Copyright 2026, JungYeon Lee