Making Homebrew works with Anaconda in 2023
How to setup Homebrew to play nicely with Anaconda
สำหรับ Mac user ปฎิเสธไม่ได้เลยว่าต้องใช้งาน Homebrew ในการเป็น Packages manager เหมือนเป็นการติดปีกให้เครื่อง Mac ที่ใช้งานง่ายอยู่แล้ว ให้ง่ายขึ้นไปอีกขั้น แต่สำหรับ Data scientist ทั้งหลายอาจเจอปัญหาอยู่บ้าง เพราะจำเป็นต้องใช้งาน Packages manager สำหรับ Python ในการจัดการ Environments หรือ Dependencies ต่าง ๆ
ปัญหาที่เกิดขึ้นคือ Homebrew และ Anaconda ทำงานด้วยกันไม่ค่อยลงรอยเท่าไหร่ ถึงขนาดที่มีแจ้งเตือนว่าอาจเป็น Bug เกิดขึ้นเมื่อใช้งานร่วมกัน Blog ตอนนี้เลยเสนอเป็นวิธีที่ทำให้ทั้ง 2 Packages managers นี้ สามารถทำงานร่วมกันได้
Python packages manager
เคยเขียน Blog ที่เป็นเนื้อหาแบบนี้มาแล้ว โดยก่อนหน้านี้หลีกเลี่ยงการใช้ Anaconda เป็น Packages manager และใช้ Homebrew ทำงานเพียงอย่างเดียว แต่เมื่อใช้งานไปสักพักแล้วพบว่า การใช้ Homebrew สำหรับจัดการ Environments หรือ Dependencies ของ Python หรือ Data science project มันไม่สะดวกเลย
เนื้อหาที่เคยเขียนไว้ก่อนหน้านี้คือ การใช้ Homebrew ติดตั้ง Python library ที่มีชื่อว่า virtualenv
เพื่อสร้างเป็น Virtual environment จากนั้นค่อย ๆ ติดตั้ง Library สำหรับการทำงานเป็นโปรเจค ๆ ไป ถือว่าเป็นวิธีที่ไม่ได้แย่มาก แต่การ Maintain ค่อนข้างลำบาก แต่ Link ด้านล่าง ก็มีเนื้อหาอื่นที่เป็นประโยชน์ เช่น การติดตั้ง Homebrew รวมถึงการ Config ค่าต่าง ๆ สามารถอ่านดูเพิ่มเติมได้เช่นกัน
Anaconda
กลับมาที่เรื่องของ Anaconda มาถึงปี 2023 นี้เชื่อว่าคงไม่มีใครไม่รู้จัก Packages manager เจ้านี้แล้ว เพราะเป็นเจ้าที่โด่งดังที่สุดในสายงาน Data science แล้ว ข้อดีหรือจุดแข็งของ Anaconda คือการรวม Libraries ที่จำเป็นสำหรับ Data science project ไว้อย่างครบถ้วน (บางคนบอกว่าเยอะเกินไป) รวมไปถึงระบบการจัดการ Maintain dependencies ต่าง ๆ ก็สามารถทำได้ยอดเยี่ยม
Anaconda มี Command conda
ที่เอาไว้ใช้จัดการสิ่งต่าง ๆ ใน Environments ไม่ว่าจะเป็นการสร้าง Environment ใหม่ การติดตั้ง Library ที่รองรับทั้ง pip install
และ conda install
รวมไปถึงการอัพเดต Dependencies ต่าง ๆ ที่สามารถทำได้อย่างสะดวกรวดเร็วด้วย conda update --all
เป็นต้น Blog ตอนนี้ไม่ได้ต้องการนำเสนอเกี่ยวกับการใช้งาน Anaconda แต่หากต้องการศึกษาเพิ่มเติม สามารถดูได้ที่ Cheat sheet เพิ่มเติม
Setup
มาพูดถึงขั้นตอนการทำให้ Homebrew ทำงานร่วมกับ Anaconda ได้สิ่งแรกที่ต้องทำคือตั้งแต่ Homebrew ซึ่งสามารถทำได้ง่าย ๆ ด้วย Shell script คำสั่งเดียว โดยสามารถ Copy command ด้านล่างแล้ว Paste ที่ Prompt ที่ใช้งานอยู่ได้ทันที
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
เมื่อติดตั้งเสร็จ Prompt จะรู้จัก Command ขึ้นมาอีก 1 Command คือ brew
ซึ่งเป็น Command ไว้เรียกใช้งานฟังก์ชั่นต่าง ๆ ของ Homebrew 1 ในสิ่งที่ต้องใช้คือ Homebrew-Cask ซึ่งเป็นเหมือนที่รวม Application ต่าง ๆ มากมายของ macOS และ Anaconda ก็ถูกรวมไว้ที่นี่เช่นกัน
สามารถค้นหา Anaconda แล้วติดตั้งผ่าน Homebrew Cask ด้วยคำสั่งด้านล่าง
brew install --cask anaconda
ใช้เวลาพักใหญ่ Anaconda จะถูกติดตั้งไว้ในเครื่อง หลังจากนี้ทั้งหมดจะเป็นปัญหาที่เจอ ซึ่งของรวบรวมเขียนไว้ใน Section ด้านล่างทั้งหมดทีเดียว
Fix
หลังจากที่ติดตั้งสมบูรณ์แล้ว macOS จะยังไม่รู้จัก Command conda
เช่นเมื่อลองพิมพ์คำสั่ง conda --version
ค่าที่ได้ Return เป็น zsh: command not found: conda
ซึ่งสามารถแก้ไขได้ด้วยการ Add path เข้าไปใน Profile ที่ใช้งาน
สามารถใช้ Build-in editor อย่าง nano ~/.zshrc
หรือ vim ~/.zshrc
เพิ่ม Add path ของ Anaconda เข้าไป สามารถ Add path ได้ด้วย Code ด้านล่าง
export PATH="/usr/local/anaconda3/bin:$PATH"
จากนั้นให้ Save profile แล้วใช้คำสั่ง source ~/.zshrc
เพื่อ Refresh profile หรือปิดแล้วเปิด Prompt ก็ได้เช่นกัน จากนั้นให้ Initial conda command ด้วย conda init zsh
(สำหรับ zsh profile) ให้ปิดแล้วเปิด Prompt อีกครั้ง สิ่งที่ได้คือการ Activate conda base environment ใน Terminal prompt
ถึงตอนนี้ Anaconda สามารถใช้งานได้อย่างสมบูรณ์แล้ว แต่ในทางกลับกันคือเกิดปัญหาขึ้นที่ Homebrew แทน เมื่อทดลองรันคำสั่ง brew doctor
จะได้หน้าต่าง Warning ขึ้นมาตามด้านล่าง
Warning: "config" scripts exist outside your system or Homebrew directories.
`./configure` scripts often look for *-config scripts to determine if
software packages are installed, and which additional flags to use when
compiling and linking.
Having additional scripts in your path can confuse software installed via
Homebrew if the config script overrides a system or Homebrew-provided
script of the same name. We found the following "config" scripts:
/usr/local/anaconda3/bin/icu-config
/usr/local/anaconda3/bin/krb5-config
/usr/local/anaconda3/bin/freetype-config
/usr/local/anaconda3/bin/xslt-config
/usr/local/anaconda3/bin/libpng16-config
/usr/local/anaconda3/bin/python3.7-config
/usr/local/anaconda3/bin/libpng-config
/usr/local/anaconda3/bin/xml2-config
/usr/local/anaconda3/bin/python3.7m-config
/usr/local/anaconda3/bin/python3-config
/usr/local/anaconda3/bin/curl-config
/usr/local/anaconda3/bin/ncursesw6-config
/usr/local/anaconda3/bin/pcre-config
/usr/local/anaconda3/bin/nspr-config
/usr/local/anaconda3/bin/ncurses6-config
/usr/local/anaconda3/bin/nss-config
Warning นี้มาจากข้อความที่ Homebrew-Cask ได้เขียนเตือนเอาไว้ โดยที่เป็นการ Config ใน Path ที่มีการเรียกใช้งาน brew
สามารถปิด Warning นี้ได้ด้วยการเพิ่ม Code ด้านล่างเข้าใน Profile .zshrc
brew() {
local -a conda_envs
while [ "$CONDA_SHLVL" -gt 0 ]; do
conda_envs=("$CONDA_DEFAULT_ENV" $conda_envs)
conda deactivate
done
command brew $@
local brew_status=$?
for env in $conda_envs; do
conda activate "$env"
done
unset env
return "$brew_status"
}
การทำงานของ Code นี้คือการ Deactivate conda environment เมื่อมีการเรียกใช้งานคำสั่ง brew
หลังจากนั้นให้ Activate conda environment ขึ้นใหม่หลังจากที่ brew
ทำงานเสร็จสิ้นแล้ว เมื่อเพิ่ม Code เสร็จให้ source ~/.zshrc
และปิดแล้วเปิด Terminal prompt ขึ้นใหม่
สิ่งที่เกิดขึ้นตามมาหลังจากเปิด Terminal prompt คือ Conda environment มีการ Auto activate เพื่อเป็นการปิด Conda และใช้ brew
เป็น Command หลัก สามารถปิดได้ด้วยคำสั่งด้านล่าง
conda config --set auto_activate_base false
สุดท้ายเมื่อปิด Auto activate conda environment แล้ว หลังจากนี้ถ้ามีการรัน brew doctor
ควรจะได้ Return เป็น Your system is ready to brew.
ตามรูปด้านล่าง
Conclusion
จบแล้ว… สำหรับขั้นตอนการ Setup เพื่อให้ใช้งาน Homebrew ร่วมกับ Anaconda มีหลาย Comment บอกว่าไม่ควรติดตั้ง Anaconda ด้วย install --cask
เพราะ Location ในการติดตั้งอาจไม่เหมือนกับ Anaconda installation ปกติ และอาจทำให้เกิดปัญหาเรื่อง Path ขึ้นได้ แต่หลังจากที่ได้ลองทำตามที่นำเสนอไปใน Blog ตอนนี้ ยังไม่พบปัญหาใด ๆ สามารถใช้งานได้ตามปกติ