קונדה-מה?

28/12/2020

פוסט זה כולל טיפ קצר לעבודה יעילה עם Python. אם אתם רוצים ללמוד פייתון יותר לעומק אני ממליץ על קורס Python כאן באתר.
הקורס כולל עשרות שיעורי וידאו והמון תרגול מעשי וילמד אתכם Python בצורה מקצועית מההתחלה ועד הנושאים המתקדמים.

לפני כמה ימים כתבתי כאן על ניהול גירסאות בפייתון ועבודה על מספר גירסאות במקביל. באותו פוסט השמטתי בכוונה את אנקונדה, שהוא כלי מאוד פופולרי בעולם ה Data Science שנועד לפתור בדיוק את אותה בעיה של עבודה על מספר סביבות פייתון במקביל על המכונה. בהמשך לאותו פוסט נראה רק הוגן לכתוב גם איך החיים נראים באנקונדה כדי שתוכלו לבחור את הגישה ושיטת העבודה המתאימה לכם.

1. שתי הבעיות הגדולות של אנשים עם pip

פיפ הוא כלי ניהול החבילות של פייתון, ולמרות שהוא עושה הרבה דברים נכון יש לו שתי בעיות שממש יכולות להרגיז, ובמיוחד כשמגיעים לעבוד על חבילות גדולות:

  1. פיפ לא כל כך טוב בניהול תלויות. אם התקנתי NumPy בשביל פרויקט ואחרי חצי שנה אני מתקין חבילה אחרת לגמרי שתלויה בגירסה מתקדמת יותר של NumPy, אז פיפ לא יזכור שפעם הוא התקין לי NumPy בגירסה ישנה יותר ועכשיו אולי הקוד שלי תלוי בגירסה הישנה יותר, ופשוט ינסה לשדרג את NumPy כדי שיתאים למה שהחבילה החדשה צריכה. זה אומר שכל התקנת חבילה עלולה לשבור לנו קוד קיים.

  2. פיפ לא כל כך טוב בחבילות שמערבות קוד C. בחבילות כאלה לפעמים צריך לקמפל דברים מקומית בזמן ההתקנה, ופיפ יצטרך שכל כלי הפיתוח בעזרתם מקמפלים דברים יהיו מותקנים לכם על המכונה.

כך לדוגמה לא מזמן ביליתי מספר שעות בהתקנת p5 על מחשב חדש, בגלל שההתקנה דרשה המון ספריות וכלים שבכלל לא קשורים לפייתון רק בשביל החיבור לקוד נייטיב. העובדה שהתקנת p5 עבדה חלק על מחשב אחר רק כמה ימים קודם רק החמירה את מצב הרוח, כי בעבודה עם pip אין לי דרך לדעת שחבילה מסוימת על מכונה מסוימת הולכת לעשות בעיות.

2. המטרה של אנקונדה

אנקונדה לוקח כיוון אחר והרבה יותר בוגר בגישה לניהול חבילות: במקום להפיץ לכם קוד מקור ותתמודדו אתם עם הקומפילציה, אנקונדה כבר מגיע עם חבילות מקומפלות לכל סביבה שאפשר לדמיין. בנוסף בכל התקנה אנקונדה ידווח לכם איזה ספריות הולכות לשנות גירסאות כדי שתוכלו לקבל החלטה מושכלת האם אתם באמת רוצים להמשיך בתהליך למרות הסיכון.

אנקונדה הוא הפצת פייתון שכוללת מאות חבילות הקשורות לעולם ה Data Science וכוללת כלי בשם Conda שהוא מנהל חבילות שיודע לעבוד עם חבילות בינאריות ומנהל תלויות טוב יותר בהשוואה ל pip. מסיבה זאת חבילות שזמינות דרך אנקונדה יותקנו בלי בעיה בכל מקום ופרויקטים שמשתמשים באנקונדה יעבדו בצורה אמינה יותר בין מכונות.

אנקונדה הוא הפצה מסחרית, שכוללת רכיבי קוד פתוח חופשיים לשימוש (אותם נראה בהמשך הפוסט) בשילוב עם חבילות תמיכה. הבחירה באנקונדה מאוד מקובלת בעולם ה Data Science אבל היא יוצרת תלות בתוכנה מסחרית שלא כולם אוהבים ולכן אנחנו פחות רואים אותה בעולמות אחרים של פייתון.

אנקונדה תומכת בכל מערכות ההפעלה ובעמוד הזה תמצאו הוראות התקנה על חלונות, מק ולינוקס: https://docs.anaconda.com/anaconda/install/

3. התקנת פייתון חדש ויצירת סביבה עבורו

אחרי שסיימתי להתקין את אנקונדה אני יכול להפעיל משורת הפקודה את הפקודה conda כדי להתחיל ליצור סביבות. לפני שהפעלתי את סביבת האנקונדה הראשונה שלי אני מפעיל את פקודת ה info כדי לראות שהכל מותקן כמו שצריך:

$ conda info

     active environment : None
            shell level : 0
       user config file : /home/ynon/.condarc
 populated config files : /home/ynon/.condarc
          conda version : 4.8.3
    conda-build version : 3.18.11
         python version : 3.8.3.final.0
       virtual packages : __glibc=2.31
       base environment : /home/ynon/anaconda3  (writable)
           channel URLs : https://repo.anaconda.com/pkgs/main/linux-64
                          https://repo.anaconda.com/pkgs/main/noarch
                          https://repo.anaconda.com/pkgs/r/linux-64
                          https://repo.anaconda.com/pkgs/r/noarch
          package cache : /home/ynon/anaconda3/pkgs
                          /home/ynon/.conda/pkgs
       envs directories : /home/ynon/anaconda3/envs
                          /home/ynon/.conda/envs
               platform : linux-64
             user-agent : conda/4.8.3 requests/2.24.0 CPython/3.8.3 Linux/5.4.0-58-generic ubuntu/20.04.1 glibc/2.31
                UID:GID : 1000:1000
             netrc file : None
           offline mode : False

והפקודה הבאה מציגה את רשימת הסביבות שכרגע מותקנות לי על המכונה:

$ conda env list
# conda environments:
#
base                  *  /home/ynon/anaconda3

סביבת base היא הסביבה שהגיעה עם anaconda וכוללת את כל החבילות שאנשי Data Science יכולים לחלום עליהן. אנחנו נשאיר אותה בצד רגע ובשביל המשחק ניצור לנו סביבה חדשה עם התקנה חדשה של פייתון. הפקודה הבאה מציגה את כל גירסאות הפייתון שאנקונדה יודע לעבוד איתן:

$ conda search python

אני יכול לראות בסוף הרשימה את גירסה 3.9.1. בואו נתקין אותה וניצור ממנה סביבת קונדה חדשה. אגב בנושא שמות, הפקודה conda היא מנהל החבילות והפצת הפייתון המלאה נקראת אנקונדה:

$ conda create -n py39-conda python=3.9.1 

הפרמטר py39-conda הוא שם הסביבה. הפעלת הפקודה תוריד מהרשת את גירסת פייתון המתאימה ותיצור עבורה סיפריה בתוך תיקיית הבית שלי.

לאחר התקנת הסביבה אני יכול לראות שהיא התווספה לרשימת הסביבות שיש לי על המכונה:

$ conda env list

# conda environments:
#
base                  *  /home/ynon/anaconda3
py39-conda               /home/ynon/anaconda3/envs/py39-conda

ואני יכול להיכנס לסביבה החדשה עם הפקודה:

$ conda activate py39-conda

4. התקנת חבילה עם conda

בתוך סביבת קונדה אני מתקין חבילות חדשות שוב עם הפקודה conda. בואו נתקין את NumPy בסביבה החדשה:

$ conda install numpy

אפשר גם לחפש חבילות עם conda search (כמו שחיפשנו את פייתון) או לבחור ולהתקין גירסה מסוימת של חבילה. מאחר ואנחנו כבר בתוך הסביבה אפשר לכתוב סקריפט שמשתמש ב NumPy ולהפעיל אותו בלי בעיה.

סביבת Conda למעשה כוללת גם גירסת פייתון שהיא התקינה, וגם את כל החבילות שמותקנות בתוך גירסה זו. אנחנו יכולים להחליט ליצור סביבת Conda עבור פרויקט מסוים או עבור אוסף פרויקטים, ולהחליף סביבה כשעוברים לעבוד על פרויקט אחר.

5. יצירת קובץ requirements.txt מתוך סביבת conda

בדומה לעבודה עם venv, גם קונדה מאפשר יצירת קובץ requirements.txt שיכיל את רשימת כל הספריות שהתקנו בתוך הסביבה והגירסאות שלהן. אפשר ליצור את הקובץ עם pip freeze כמו שאתם מכירים, או באמצעות conda עם הפקודה:

$ conda list -e

# This file may be used to create an environment using:
# $ conda create --name <env> --file <this file>
# platform: linux-64
_libgcc_mutex=0.1=main
blas=1.0=openblas
ca-certificates=2020.12.8=h06a4308_0
certifi=2020.12.5=py39h06a4308_0
ld_impl_linux-64=2.33.1=h53a641e_7
libedit=3.1.20191231=h14c3975_1
libffi=3.3=he6710b0_2
libgcc-ng=9.1.0=hdf63c60_0
libgfortran-ng=7.3.0=hdf63c60_0
libopenblas=0.3.10=h5a2b251_0
libstdcxx-ng=9.1.0=hdf63c60_0
ncurses=6.2=he6710b0_1
numpy=1.19.2=py39h87658db_0
numpy-base=1.19.2=py39h0f7b65f_0
openssl=1.1.1i=h27cfd23_0
pip=20.3.3=py39h06a4308_0
python=3.9.1=hdb3f193_2
readline=8.0=h7b6447c_0
setuptools=51.0.0=py39h06a4308_2
sqlite=3.33.0=h62c20be_0
tk=8.6.10=hbc83047_0
tzdata=2020d=h14c3975_0
wheel=0.36.2=pyhd3eb1b0_0
xz=5.2.5=h7b6447c_0
zlib=1.2.11=h7b6447c_3

נשים לב שמשהו פה לא נראה כמו קובץ ה requirements.txt שאנחנו רגילים מעבודה עם pip. מספרי הגירסאות ייחודיים לאנקונדה ובשביל להתקין את הקובץ הזה על מכונה אחרת נצטרך להשתמש ב conda עצמו (הפקודה מופיעה בהערה בראש הקובץ).

6. יצוא ויבוא סביבות קונדה

שיטה יותר מקובלת להעביר מידע על גירסאות והתקנות בין מכונות באנקונדה היא יצוא ויבוא סביבות. זה נראה כך:

$ conda env export --from-history

name: py39-conda
channels:
  - defaults
dependencies:
  - python=3.9.1
  - numpy
prefix: /home/ynon/anaconda3/envs/py39-conda

$ conda env export --from-history > environment.yml

לאחר מכן נעתיק את הקובץ environment.yml למכונת היעד ושם נפעיל את הפקודה הבאה כדי ליצור את הסביבה:

conda env create -f environment.yml

7. אז במה לבחור?

אחרי כל מה שכתבנו על אנקונדה השאלה לדעתי נשארת - האם לבחור ב Anaconda או ב pip וחבריו? היתרונות של אנקונדה ברורים:

  1. כלי אחד שעושה את הכל.

  2. פיתרון טוב יותר מ pip לנושא ניהול התלויות.

  3. מעבר חלק יותר בין סביבות והתקנות אמינות יותר.

מצד שני אנקונדה עובד בעולם שלו, עם החבילות שלו ונועל אותנו לסביבה שלו. מרגע שהתחלתי לעבוד עם Anaconda אני לא ארצה לשלב חבילות pip רגילות כדי לא לקלקל את ניהול התלויות, וכמובן שאצטרך להשתמש בכלים של אנקונדה כדי להעביר את הקוד שלי למכונות אחרות (ולכן גם שם צריך להתקין את אנקונדה). ההעדפה שלי, למרות שזה כרוך ביותר עבודה, היא לבחור בכלים הפתוחים pip, venv ו pyenv כדי לנהל את גירסאות הפייתון והחבילות אצלי על המכונה. בכל זאת שווה להכיר גם את קונדה ולבחור את הכלי שמתאים ביותר לפרויקט ולגישה שלכם.