יצירת אינדקסים ב-ScaNN
מידע נוסף זמין במאמר בנושא ScaNN Index reference.
אינדקס עץ דו-רמתי
כדי ליישם המלצות שיעזרו לכם למצוא את הערכים האופטימליים של num_leaves ושל num_leaves_to_search עבור מערך הנתונים שלכם, פועלים לפי השלבים המומלצים הבאים:
- כדי ליצור את האינדקס
ScaNNשממוטב למקרים הבאים, מגדירים את הפרמטרnum_leavesלערך הבא, כאשר rows הוא מספר השורות בטבלה המאונדקסת:- balanced index build time and quality set
num_leavestosqrt(rows). - quality num_leaves מוגדר כ-rows/100.
- balanced index build time and quality set
- מריצים את שאילתות הבדיקה, ומגדילים את הערך של
scann.num_of_leaves_to_search, עד שמגיעים לטווח היעד של הזיכרון – למשל, 95%. מידע נוסף על ניתוח השאילתות זמין במאמר ניתוח השאילתות. - חשוב לשים לב ליחס בין
scann.num_leaves_to_searchלביןnum_leaves, שבו תשתמשו בשלבים הבאים. היחס הזה מספק קירוב לגבי מערך הנתונים שיעזור לכם להשיג את יעד ההחזרה.
אם אתם עובדים עם וקטורים של מימדים גבוהים (500 מימדים ומעלה) ורוצים לשפר את ההחזרה, נסו לשנות את הערך שלscann.pre_reordering_num_neighbors. ערך ברירת המחדל מוגדר לערך500 * K, כאשרKהוא המגבלה שהגדרתם בשאילתה. - אם ערך השאילתות לשנייה נמוך מדי אחרי שהשאילתות משיגות את ערך ההחזרה (recall) הרצוי, צריך לבצע את השלבים הבאים:
- יוצרים מחדש את האינדקס, ומגדילים את הערכים של
num_leavesושלscann.num_leaves_to_searchבהתאם להנחיות הבאות:- מגדירים את
num_leavesלגורם גדול יותר של השורש הריבועי של מספר השורות. לדוגמה, אם האינדקסnum_leavesמוגדר לשורש הריבועי של מספר השורות, נסו להגדיר אותו כפול משורש הריבועי. אם הערך כבר הוכפל, נסו להגדיר אותו כערך משולש של השורש הריבועי. - מגדילים את
scann.num_leaves_to_searchלפי הצורך כדי לשמור על היחס שלו עםnum_leaves, שרשמתם בשלב 3. - מגדירים את
num_leavesלערך שקטן ממספר השורות חלקי 100 או שווה לו.
- מגדירים את
- מריצים שוב את שאילתות הבדיקה.
במהלך הרצת שאילתות הבדיקה, כדאי להתנסות בהפחתת
scann.num_leaves_to_search, כדי למצוא ערך שמגדיל את QPS תוך שמירה על ערך גבוה של recall. כדאי לנסות ערכים שונים שלscann.num_leaves_to_searchבלי לבנות מחדש את האינדקס.
- יוצרים מחדש את האינדקס, ומגדילים את הערכים של
- חוזרים על שלב 4 עד שגם ה-QPS וגם טווח ההחזרה מגיעים לערכים מקובלים.
אינדקס עץ עם שלוש רמות
בנוסף להמלצות לגבי אינדקס של עץ עם שתי רמות ScaNN, כדאי לפעול לפי ההנחיות הבאות.
כדי ליישם המלצות ולמצוא את הערך האופטימלי של פרמטרים של אינדקס num_leaves ו-max_num_levels, פועלים לפי השלבים הבאים:
יוצרים את אינדקס
ScaNNעם השילובים הבאים שלnum_leavesו-max_num_levelsבהתאם ליעדי הביצועים:- זמן בניית אינדקס האיזון ואיכותו: מגדירים את
max_num_levelsכ-2ואתnum_leavesכ-power(rows, ⅔). - אופטימיזציה לאיכות: מגדירים את
max_num_levelsכ-2ואתnum_leavesכ-rows/100.
- זמן בניית אינדקס האיזון ואיכותו: מגדירים את
מריצים את שאילתות הבדיקה. מידע נוסף על ניתוח שאילתות זמין במאמר ניתוח השאילתות.
חשוב לשים לב ליחס בין
scann.num_leaves_to_searchל-num_leaves, שבו תשתמשו בשלבים הבאים. היחס הזה מספק קירוב לגבי מערך הנתונים שיעזור לכם להשיג את יעד ההיזכרות.
אם אתם עובדים עם וקטורים של מאפיינים גבוהים (500 מאפיינים ומעלה) ורוצים לשפר את ההחזרה, כדאי לנסות לשנות את הערך של scann.pre_reordering_num_neighbors. ערך ברירת המחדל מוגדר לערך 500 * K, כאשר K הוא המגבלה שהגדרתם בשאילתה.
אם ערך ה-QPS נמוך מדי אחרי שהשאילתות משיגות את ערך הזיכרון (recall) הרצוי, צריך לפעול לפי השלבים הבאים:
- יוצרים מחדש את האינדקס, ומגדילים את הערכים של
num_leavesו-scann.num_leaves_to_searchבהתאם להנחיות הבאות: - מגדירים את
num_leavesכגורם גדול יותר שלpower(rows, ⅔). לדוגמה, אם הערך שלnum_leavesבאינדקס מוגדר ל-power(rows, ⅔), נסו להגדיר אותו לערך כפול מ-power(rows, ⅔). אם הערך כבר הוכפל, נסו להגדיר אותו כערך משולש שלpower(rows, ⅔). - מגדילים את
scann.num_leaves_to_searchלפי הצורך כדי לשמור על היחס שלו ל-num_leaves, שציינתם בשלב 3. - צריך להגדיר ל-
num_leavesערך שקטן מ-rows/100או שווה לו. - מריצים שוב את שאילתות הבדיקה. במהלך הרצת שאילתות הבדיקה, כדאי להתנסות בהפחתת
scann.num_leaves_to_search, כדי למצוא ערך שמגדיל את QPS תוך שמירה על ערך גבוה של recall. אפשר לנסות ערכים שונים שלscann.num_leaves_to_searchבלי לבנות מחדש את האינדקס.
- יוצרים מחדש את האינדקס, ומגדילים את הערכים של
חוזרים על שלב 4 עד שגם ה-QPS וגם טווח ההחזרה מגיעים לערכים מקובלים.
תחזוקת האינדקס
אם הטבלה שלכם נוטה להתעדכן או להשתנות לעיתים קרובות, מומלץ ליצור מחדש את האינדקס הקיים ScaNN באופן תקופתי כדי לשפר את דיוק האחזור.
אתם יכולים לעקוב אחרי מדדי האינדקס כדי לראות שינויים בהתפלגויות הווקטורים או במוטציות הווקטורים מאז בניית האינדקס, ואז לבצע אינדוקס מחדש בהתאם. מידע נוסף על מדדים זמין במאמר מדדים של אינדקס וקטורי.