chronon عبارة عن منصة تتخلص من تعقيد حساب البيانات وخدمة تطبيقات الذكاء الاصطناعي/تعلم الآلة. يعرّف المستخدمون الميزات على أنها تحويل للبيانات الأولية، ثم يمكن chronon إجراء عمليات حسابية مجمعة ومتدفقة، وعمليات ردم قابلة للتطوير، وخدمة زمن وصول منخفض، وصحة واتساق مضمونين، بالإضافة إلى مجموعة من أدوات المراقبة والمراقبة.
فهو يتيح لك الاستفادة من جميع البيانات داخل مؤسستك، بدءًا من الجداول المجمعة أو تدفقات الأحداث أو الخدمات لتشغيل مشاريع الذكاء الاصطناعي/تعلم الآلة الخاصة بك، دون الحاجة إلى القلق بشأن كل التنسيق المعقد الذي قد يستلزمه ذلك عادةً.
يمكن العثور على مزيد من المعلومات حول chronon على chronon .ai.
يقدم chronon واجهة برمجة تطبيقات للجلب في الوقت الفعلي والتي تُرجع قيمًا محدثة لميزاتك. وهو يدعم:
غالبًا ما يحتاج ممارسو تعلم الآلة إلى وجهات نظر تاريخية لقيم الميزات للتدريب النموذجي والتقييم. عمليات ردم chronon هي:
يوفر chronon رؤية في:
يدعم chronon مجموعة من أنواع التجميع. للحصول على القائمة الكاملة، راجع الوثائق هنا.
يمكن تكوين جميع هذه المجموعات ليتم حسابها على أحجام النوافذ العشوائية.
يرشدك هذا القسم خلال خطوات إنشاء مجموعة بيانات تدريب باستخدام chronon ، باستخدام مجموعة بيانات أولية ملفقة.
يشمل:
GroupBy
و Join
.لا يشمل:
للبدء في استخدام chronon ، كل ما عليك فعله هو تنزيل ملف docker-compose.yml وتشغيله محليًا:
curl -o docker-compose.yml https://chronon.ai/docker-compose.yml
docker-compose up
بمجرد رؤية بعض البيانات مطبوعة مع إشعار only showing top 20 rows
، فأنت جاهز لمتابعة البرنامج التعليمي.
في هذا المثال، لنفترض أننا بائع تجزئة كبير عبر الإنترنت، وقد اكتشفنا ناقل احتيال يعتمد على المستخدمين الذين يقومون بعمليات شراء ثم يعيدون العناصر لاحقًا. نريد تدريب نموذج سيتم استدعاؤه عند بدء تدفق عملية الدفع والتنبؤ بما إذا كان من المحتمل أن تؤدي هذه المعاملة إلى عائد احتيالي.
يتم تضمين البيانات الخام ملفقة في دليل البيانات. ويتضمن أربعة جداول:
في نافذة طرفية جديدة، قم بتشغيل:
docker-compose exec main bash
سيؤدي هذا إلى فتح غلاف داخل حاوية chronon docker.
الآن بعد أن اكتملت خطوات الإعداد، يمكننا البدء في إنشاء واختبار كائنات chronon المختلفة لتحديد التحويل والتجميعات وإنشاء البيانات.
لنبدأ بثلاث مجموعات من الميزات، مبنية على مصادر المدخلات الأولية لدينا.
ملحوظة: تعريفات بايثون هذه موجودة بالفعل في صورة chronon
الخاصة بك. لا يوجد شيء يمكنك تشغيله حتى الخطوة 3 - إعادة تعبئة البيانات عندما تقوم بتشغيل الحساب لهذه التعريفات.
مجموعة الميزات 1: شراء ميزات البيانات
يمكننا تجميع بيانات سجل المشتريات على مستوى المستخدم، لإعطائنا نظرة على النشاط السابق لهذا المستخدم على منصتنا. على وجه التحديد، يمكننا حساب SUM
s COUNT
s و AVERAGE
s لمبالغ الشراء السابقة عبر النوافذ المختلفة.
نظرًا لأن هذه الميزة مبنية على مصدر يتضمن جدولاً وموضوعًا، فيمكن حساب ميزاتها دفعةً وتدفقًا.
source = Source (
events = EventSource (
table = "data.purchases" , # This points to the log table with historical purchase events
topic = None , # Streaming is not currently part of quickstart, but this would be where you define the topic for realtime events
query = Query (
selects = select ( "user_id" , "purchase_price" ), # Select the fields we care about
time_column = "ts" ) # The event time
))
window_sizes = [ Window ( length = day , timeUnit = TimeUnit . DAYS ) for day in [ 3 , 14 , 30 ]] # Define some window sizes to use below
v1 = GroupBy (
sources = [ source ],
keys = [ "user_id" ], # We are aggregating by user
aggregations = [ Aggregation (
input_column = "purchase_price" ,
operation = Operation . SUM ,
windows = window_sizes
), # The sum of purchases prices in various windows
Aggregation (
input_column = "purchase_price" ,
operation = Operation . COUNT ,
windows = window_sizes
), # The count of purchases in various windows
Aggregation (
input_column = "purchase_price" ,
operation = Operation . AVERAGE ,
windows = window_sizes
) # The average purchases by user in various windows
],
)
شاهد ملف التعليمات البرمجية بالكامل هنا: مشتريات GroupBy. هذا أيضًا موجود في صورة عامل الإرساء الخاص بك. سنقوم بإجراء عملية حسابية له ولمجموعات GroupBys الأخرى في الخطوة 3 - إعادة تعبئة البيانات.
مجموعة الميزات 2: إرجاع ميزات البيانات
نقوم بإجراء مجموعة مماثلة من التجميعات على بيانات المرتجعات في المرتجعات GroupBy. لم يتم تضمين الكود هنا لأنه يشبه المثال أعلاه.
مجموعة الميزات 3: ميزات بيانات المستخدم
يعد تحويل بيانات المستخدم إلى ميزات أسهل قليلاً، ويرجع ذلك أساسًا إلى عدم وجود مجموعات لتضمينها. في هذه الحالة، يكون المفتاح الأساسي للبيانات المصدر هو نفس المفتاح الأساسي للميزة، لذلك نحن ببساطة نستخرج قيم الأعمدة بدلاً من إجراء عمليات التجميع على الصفوف:
source = Source (
entities = EntitySource (
snapshotTable = "data.users" , # This points to a table that contains daily snapshots of the entire product catalog
query = Query (
selects = select ( "user_id" , "account_created_ds" , "email_verified" ), # Select the fields we care about
)
))
v1 = GroupBy (
sources = [ source ],
keys = [ "user_id" ], # Primary key is the same as the primary key for the source table
aggregations = None # In this case, there are no aggregations or windows to define
)
مأخوذة من مستخدمي GroupBy.
بعد ذلك، نحتاج إلى ملء الميزات التي حددناها مسبقًا في جدول واحد للتدريب النموذجي. يمكن تحقيق ذلك باستخدام Join
API.
بالنسبة لحالة الاستخدام الخاصة بنا، من المهم جدًا أن يتم حساب الميزات وفقًا للطابع الزمني الصحيح. نظرًا لأن نموذجنا يعمل عند بدء تدفق عملية الدفع، فسنريد التأكد من استخدام الطابع الزمني المقابل في عملية إعادة التعبئة، بحيث تتطابق قيم الميزات الخاصة بتدريب النموذج بشكل منطقي مع ما سيراه النموذج في الاستدلال عبر الإنترنت.
Join
هو واجهة برمجة التطبيقات (API) التي تدفع عمليات إعادة ملء الميزات لبيانات التدريب. يقوم في المقام الأول بالوظائف التالية:
Join
).إليك ما يبدو عليه انضمامنا:
source = Source (
events = EventSource (
table = "data.checkouts" ,
query = Query (
selects = select ( "user_id" ), # The primary key used to join various GroupBys together
time_column = "ts" ,
) # The event time used to compute feature values as-of
))
v1 = Join (
left = source ,
right_parts = [ JoinPart ( group_by = group_by ) for group_by in [ purchases_v1 , refunds_v1 , users ]] # Include the three GroupBys
)
مأخوذة من التدريب_مجموعة الانضمام.
الجانب left
من الصلة هو ما يحدد الطوابع الزمنية والمفاتيح الأساسية لإعادة التعبئة (لاحظ أنه تم إنشاؤه أعلى حدث checkout
، وفقًا لما تمليه حالة الاستخدام لدينا).
لاحظ أن هذا Join
يجمع بين مجموعات GroupBy
الثلاثة المذكورة أعلاه في تعريف بيانات واحد. في الخطوة التالية، سنقوم بتشغيل الأمر لتنفيذ عملية حسابية لخط الأنابيب بأكمله.
بمجرد تحديد الصلة، نقوم بتجميعها باستخدام هذا الأمر:
compile.py --conf=joins/quickstart/training_set.py
يؤدي هذا إلى تحويله إلى تعريف التوفير الذي يمكننا تقديمه للإثارة باستخدام الأمر التالي:
run.py --conf production/joins/quickstart/training_set.v1
سيحتوي ناتج إعادة التعبئة على عمودين user_id وts من المصدر الأيسر، بالإضافة إلى 11 عمودًا من مجموعات GroupBys الثلاثة التي أنشأناها.
سيتم حساب قيم الميزات لكل user_id وts على الجانب الأيسر، بدقة زمنية مضمونة. لذلك، على سبيل المثال، إذا كان أحد الصفوف الموجودة على اليسار مخصصًا لـ user_id = 123
و ts = 2023-10-01 10:11:23.195
، فسيتم حساب ميزة purchase_price_avg_30d
لهذا المستخدم بفترة زمنية محددة مدتها 30 يومًا تنتهي بتاريخ هذا الطابع الزمني.
يمكنك الآن الاستعلام عن البيانات التي تم ملؤها باستخدام Spark SQL Shell:
spark-sql
وثم:
spark - sql > SELECT user_id, quickstart_returns_v1_refund_amt_sum_30d, quickstart_purchases_v1_purchase_price_sum_14d, quickstart_users_v1_email_verified from default . quickstart_training_set_v1 limit 100 ;
لاحظ أن هذا لا يؤدي إلا إلى تحديد عدد قليل من الأعمدة. يمكنك أيضًا تشغيل select * from default.quickstart_training_set_v1 limit 100
لرؤية جميع الأعمدة، ومع ذلك، لاحظ أن الجدول واسع جدًا وقد لا تكون النتائج قابلة للقراءة بشكل كبير على شاشتك.
للخروج من SQL Shell يمكنك تشغيل:
spark-sql > quit ;
الآن بعد أن قمنا بإنشاء صلة وتعبئة البيانات، ستكون الخطوة التالية هي تدريب نموذج. هذا ليس جزءًا من هذا البرنامج التعليمي، ولكن بافتراض أنه كان مكتملاً، فإن الخطوة التالية بعد ذلك ستكون إنتاج النموذج عبر الإنترنت. للقيام بذلك، نحن بحاجة إلى أن نكون قادرين على جلب ناقلات المعالم لاستدلال النموذج. وهذا ما يغطيه هذا القسم التالي.
من أجل خدمة التدفقات عبر الإنترنت، نحتاج أولاً إلى تحميل البيانات إلى متجر KV عبر الإنترنت. ويختلف هذا عن إعادة التعبئة التي قمنا بها في الخطوة السابقة بطريقتين:
تحميل المشتريات GroupBy:
run.py --mode upload --conf production/group_bys/quickstart/purchases.v1 --ds 2023-12-01
spark-submit --class ai. chronon .quickstart.online.Spark2MongoLoader --master local[ * ] /srv/onlineImpl/target/scala-2.12/mongo-online-impl-assembly-0.1.0-SNAPSHOT.jar default.quickstart_purchases_v1_upload mongodb://admin:admin@mongodb:27017/ ? authSource=admin
تحميل المرتجعات GroupBy:
run.py --mode upload --conf production/group_bys/quickstart/returns.v1 --ds 2023-12-01
spark-submit --class ai. chronon .quickstart.online.Spark2MongoLoader --master local[ * ] /srv/onlineImpl/target/scala-2.12/mongo-online-impl-assembly-0.1.0-SNAPSHOT.jar default.quickstart_returns_v1_upload mongodb://admin:admin@mongodb:27017/ ? authSource=admin
إذا أردنا استخدام واجهة برمجة تطبيقات FetchJoin
بدلاً من FetchGroupby
، فسنحتاج أيضًا إلى تحميل بيانات تعريف الانضمام:
run.py --mode metadata-upload --conf production/joins/quickstart/training_set.v2
وهذا يجعل أداة الجلب عبر الإنترنت تعرف كيفية تلقي طلب لهذا الانضمام وتقسيمه إلى طلبات GroupBy فردية، مما يؤدي إلى إرجاع المتجه الموحد، على غرار الطريقة التي تنتج بها عملية إعادة الانضمام جدول العرض الواسع بجميع الميزات.
بعد تحديد الكيانات المذكورة أعلاه، يمكنك الآن بسهولة جلب متجهات الميزات من خلال استدعاء بسيط لواجهة برمجة التطبيقات (API).
جلب الانضمام:
run.py --mode fetch --type join --name quickstart/training_set.v2 -k ' {"user_id":"5"} '
يمكنك أيضًا جلب GroupBy واحد (لا يتطلب ذلك إجراء خطوة تحميل البيانات التعريفية للانضمام مسبقًا):
run.py --mode fetch --type group-by --name quickstart/purchases.v1 -k ' {"user_id":"5"} '
بالنسبة للإنتاج، عادةً ما يتم تضمين عميل Java مباشرة في الخدمات.
Map < String , String > keyMap = new HashMap <>();
keyMap . put ( "user_id" , "123" );
Fetcher . fetch_join ( new Request ( "quickstart/training_set_v1" , keyMap ))
استجابة العينة
> '{"purchase_price_avg_3d":14.3241, "purchase_price_avg_14d":11.89352, ...}'
ملاحظة: كود جافا هذا غير قابل للتشغيل في بيئة عامل الإرساء، إنه مجرد مثال توضيحي.
كما تمت مناقشته في الأقسام التمهيدية من هذا الملف التمهيدي، فإن أحد الضمانات الأساسية لـ chronon هو الاتساق عبر الإنترنت/دون الاتصال بالإنترنت. وهذا يعني أن البيانات التي تستخدمها لتدريب النموذج الخاص بك (بدون اتصال) تتطابق مع البيانات التي يراها النموذج لاستدلال الإنتاج (عبر الإنترنت).
والعنصر الأساسي في ذلك هو الدقة الزمنية. يمكن صياغة ذلك على النحو التالي: عند إعادة ملء الميزات، يجب أن تكون القيمة التي يتم إنتاجها لأي timestamp
معين يوفره الجانب الأيسر من الصلة هي نفس ما كان سيتم إرجاعه عبر الإنترنت إذا تم جلب هذه الميزة في ذلك timestamp
المحدد .
لا يضمن chronon هذه الدقة الزمنية فحسب، بل يوفر أيضًا طريقة لقياسها.
يبدأ مسار القياس بسجلات طلبات الجلب عبر الإنترنت. تتضمن هذه السجلات المفاتيح الأساسية والطابع الزمني للطلب، بالإضافة إلى قيم الميزات التي تم جلبها. يقوم chronon بعد ذلك بتمرير المفاتيح والطوابع الزمنية إلى تعبئة الانضمام باعتبارها الجانب الأيسر، ويطلب من محرك الحوسبة إعادة ملء قيم الميزات. ثم يقوم بعد ذلك بمقارنة القيم التي تم ردمها بالقيم التي تم جلبها فعليًا لقياس الاتساق.
الخطوة 1: جلب السجل
أولاً، تأكد من قيامك بتشغيل بعض طلبات الجلب. يجري:
run.py --mode fetch --type join --name quickstart/training_set.v2 -k '{"user_id":"5"}'
عدة مرات لتوليد بعض عمليات الجلب.
بعد اكتمال ذلك، يمكنك تشغيل هذا لإنشاء جدول سجل قابل للاستخدام (تنتج هذه الأوامر جدول خلية تسجيل بالمخطط الصحيح):
spark-submit --class ai. chronon .quickstart.online.MongoLoggingDumper --master local[ * ] /srv/onlineImpl/target/scala-2.12/mongo-online-impl-assembly-0.1.0-SNAPSHOT.jar default. chronon _log_table mongodb://admin:admin@mongodb:27017/ ? authSource=admin
compile.py --conf group_bys/quickstart/schema.py
run.py --mode backfill --conf production/group_bys/quickstart/schema.v1
run.py --mode log-flattener --conf production/joins/quickstart/training_set.v2 --log-table default. chronon _log_table --schema-table default.quickstart_schema_v1
يؤدي هذا إلى إنشاء جدول default.quickstart_training_set_v2_logged
الذي يحتوي على نتائج كل من طلبات الجلب التي قمت بإجرائها مسبقًا، بالإضافة إلى الطابع الزمني الذي قمت بإجرائها user
الذي طلبته.
ملاحظة: بمجرد تشغيل الأمر أعلاه، فإنه سيتم إنشاء و"إغلاق" أقسام السجل، مما يعني أنه إذا قمت بإجراء عمليات جلب إضافية في نفس اليوم (توقيت UTC) فلن يتم إلحاقها. إذا كنت تريد العودة وإنشاء المزيد من الطلبات للتناسق عبر الإنترنت/دون اتصال، فيمكنك إسقاط الجدول (تشغيل DROP TABLE default.quickstart_training_set_v2_logged
في spark-sql
Shell) قبل إعادة تشغيل الأمر أعلاه.
يمكنك الآن حساب مقاييس الاتساق باستخدام هذا الأمر:
run.py --mode consistency-metrics-compute --conf production/joins/quickstart/training_set.v2
ستأخذ هذه المهمة المفتاح (المفاتيح) الأساسية والطوابع الزمنية من جدول السجل ( default.quickstart_training_set_v2_logged
في هذه الحالة)، وتستخدمها لإنشاء عملية إعادة ربط وتشغيلها. ثم يقوم بعد ذلك بمقارنة النتائج التي تم ردمها بالقيم المسجلة الفعلية التي تم جلبها عبر الإنترنت
ينتج جدولين للإخراج:
default.quickstart_training_set_v2_consistency
: جدول يمكن قراءته بواسطة الإنسان ويمكنك الاستعلام عنه لرؤية نتائج اختبارات الاتساق.spark-sql
من جلسة docker bash، ثم الاستعلام عن الجدول.DESC default.quickstart_training_set_v2_consistency
أولاً، ثم حدد بعض الأعمدة التي تهتم بها للاستعلام عنها.default.quickstart_training_set_v2_consistency_upload
: قائمة بايتات KV التي تم تحميلها إلى متجر KV عبر الإنترنت، والتي يمكن استخدامها لتشغيل تدفقات مراقبة جودة البيانات عبر الإنترنت. ليس من المفترض أن تكون قابلة للقراءة من قبل الإنسان. يؤدي استخدام chronon لعملك الهندسي المميز إلى تبسيط وتحسين سير عمل تعلم الآلة بعدة طرق:
للحصول على عرض أكثر تفصيلاً حول فوائد استخدام chronon ، راجع فوائد وثائق chronon .
يقدم chronon القيمة الأكبر لممارسي الذكاء الاصطناعي/التعلم الآلي الذين يحاولون إنشاء نماذج "عبر الإنترنت" تخدم الطلبات في الوقت الفعلي بدلاً من سير العمل المجمع.
بدون chronon ، يحتاج المهندسون العاملون في هذه المشاريع إلى معرفة كيفية إيصال البيانات إلى نماذجهم للتدريب/التقييم بالإضافة إلى استنتاج الإنتاج. مع زيادة تعقيد البيانات التي تدخل في هذه النماذج (مصادر متعددة، تحويل معقد مثل التجميعات ذات النوافذ، وما إلى ذلك)، فإن تحدي البنية التحتية المتمثل في دعم توصيل البيانات هذا يزداد أيضًا.
بشكل عام، لاحظنا أن ممارسي تعلم الآلة يتبعون أحد النهجين:
باستخدام هذا الأسلوب، يبدأ المستخدمون بالبيانات المتوفرة في بيئة العرض عبر الإنترنت والتي سيتم تشغيل استنتاج النموذج منها. قم بتسجيل الميزات ذات الصلة إلى مستودع البيانات. بمجرد تراكم ما يكفي من البيانات، قم بتدريب النموذج على السجلات وتقديمه بنفس البيانات.
الايجابيات:
سلبيات:
باستخدام هذا النهج، يقوم المستخدمون بتدريب النموذج باستخدام البيانات من مستودع البيانات، ثم اكتشاف طرق لتكرار هذه الميزات في البيئة عبر الإنترنت.
الايجابيات:
سلبيات:
نهج chronon
باستخدام chronon يمكنك استخدام أي بيانات متاحة في مؤسستك، بما في ذلك كل شيء في مستودع البيانات، وأي مصدر دفق، ومكالمات الخدمة، وما إلى ذلك، مع ضمان الاتساق بين البيئات المتصلة بالإنترنت وغير المتصلة بالإنترنت. إنه يزيل تعقيد البنية التحتية لتنظيم وصيانة تدفق البيانات، بحيث يمكن للمستخدمين ببساطة تحديد الميزات في واجهة برمجة تطبيقات بسيطة، والثقة في chronon للتعامل مع الباقي.
نحن نرحب بالمساهمات في مشروع chronon ! يرجى قراءة المساهمة للحصول على التفاصيل.
استخدم متتبع مشكلات GitHub للإبلاغ عن الأخطاء أو طلبات الميزات. انضم إلى مساحة عمل مجتمع Slack الخاصة بنا للحصول على المناقشات والنصائح والدعم.