For the complete documentation index, see llms.txt. This page is also available as Markdown.

गतिशील Python ब्लॉक्स

Execution Engine द्वारा रनटाइम पर व्याख्यायित किए जाने वाले Python कोड के साथ Workflow Definition में सीधे blocks परिभाषित करें।

इस सुविधा के उत्पाद-स्तरीय परिचय के लिए देखें कस्टम ब्लॉक्स. इनलाइन कोड के बजाय पूरी Block class लिखने के लिए देखें एक Workflow block बनाएँ.

जब Workflow परिभाषाओं के लिए सिंटैक्स था रेखांकित, एक महत्वपूर्ण पहलू शामिल नहीं था: Workflow परिभाषा के भीतर ही सीधे blocks परिभाषित करने की क्षमता। इस अनुभाग में in-place परिभाषित blocks के लिए manifest और Python code शामिल हो सकता है, जिन्हें Execution Engine द्वारा गतिशील रूप से व्याख्यायित किया जाता है। ये in-place blocks उन्हीं की तरह काम करते हैं जो स्थिर रूप से परिभाषित होते हैं प्लगइन्स लेकिन ये कहीं अधिक लचीलापन प्रदान करते हैं।

निष्पादन मोड

Dynamic Python blocks दो निष्पादन मोड का समर्थन करते हैं:

स्थानीय निष्पादन

जब आप अपने स्वयं के हार्डवेयर पर स्थानीय रूप से inference चलाते हैं, तो dynamic blocks सीधे आपके environment में execute होते हैं। यह विकास और परीक्षण के लिए सबसे तेज़ प्रदर्शन प्रदान करता है।

क्लाउड निष्पादन (Roboflow Serverless v2)

Roboflow की क्लाउड infrastructure को Serverless v2 API के साथ उपयोग करते समय, dynamic blocks सुरक्षित, पृथक containers में execute होते हैं। इससे आपके infrastructure से समझौता किए बिना custom code का सुरक्षित निष्पादन सुनिश्चित होता है।

क्लाउड निष्पादन वातावरण स्थानीय निष्पादन के समान standard libraries और imports प्रदान करता है, जिससे आपका code दोनों मोड में समान रूप से काम करता है।

स्थिति प्रबंधन और साझा डेटा

module level पर परिभाषित variables (आपके ... के बाहर) run function) आपके block के code में उस block के instances तक सीमित (scoped) होते हैं। ये variables:

  • invocations के बीच बने रहते हैं उसी block के (जब तक code नहीं बदलता)

  • block का code बदलने पर reset हो जाते हैं block के code में कोई भी संशोधन एक नया namespace बनाता है

  • server/container के restart होने पर खो जाते हैं

उदाहरण:

यह block हर बार चलने पर एक counter बढ़ाता है और अंतिम परिणाम को याद रखता है:

स्थिति प्रबंधन के सर्वोत्तम अभ्यास

Custom Block state महंगी गणनाओं को कैश करने और artifact तथा dependency loading को अनुकूलित करने के लिए है।

  • महत्वपूर्ण डेटा स्थायित्व के लिए state पर निर्भर न रहें - महत्वपूर्ण डेटा के लिए बाहरी storage का उपयोग करें।

  • server restarts या container scaling के कारण state किसी भी समय खो सकती है

  • क्लाउड वातावरण में, बाद के अनुरोध अलग-अलग state वाले अलग servers पर जा सकते हैं

  • नए शुरूआतों को संभालने के लिए block-scoped variables को default values के साथ initialize करें

  • state को हल्का रखें। बड़े objects memory लेते हैं और performance को प्रभावित कर सकते हैं।

सिद्धांत

Dynamic Python blocks की कार्यक्षमता का उच्च-स्तरीय अवलोकन:

  • उपयोगकर्ता JSON में dynamic block की परिभाषा प्रदान करता है

  • परिभाषा में Execution Engine को बनाने के लिए आवश्यक जानकारी होती है WorkflowBlockManifest और WorkflowBlock दस्तावेज़ से

  • रनटाइम पर, Compiler परिभाषा को गतिशील रूप से बनाई गई Python classes में बदल देता है - बिल्कुल उसी तरह जैसे statically defined blocks

  • Workflow परिभाषा में, आप ऐसे steps घोषित कर सकते हैं जो dynamic blocks का उपयोग करते हैं, मानो dynamic blocks सामान्य स्थिर blocks हों

उदाहरण

आइए देखें और dynamic Python blocks वाले example workflow पर चर्चा करें।

dynamic block वाला Workflow

आइए विश्लेषण की शुरुआत करें dynamic_blocks_definitions - यह Workflow Definition का वह भाग है जो dynamic blocks की सूची प्रदान करता है। प्रत्येक block में दो अनुभाग होते हैं:

block manifest की परिभाषा

Manifest परिभाषा में कई फ़ील्ड शामिल होते हैं, जिनमें:

  • block_type - के समतुल्य type block manifest में फ़ील्ड - अद्वितीय block identifier प्रदान करना आवश्यक है

  • inputs - dynamic inputs के नाम और परिभाषाओं वाली dictionary

  • outputs - dynamic outputs के नाम और परिभाषाओं वाली dictionary

  • output_dimensionality_offset - फ़ील्ड output dimensionality निर्दिष्ट करता है

  • accepts_batch_input - फ़ील्ड निर्धारित करता है कि runtime में input data Execution Engine द्वारा batches में प्रदान किया जाएगा या नहीं

  • accepts_empty_values - फ़ील्ड यह तय करता है कि step inputs बनाते समय खाली inputs को अनदेखा किया जाएगा या नहीं

किसी भी संदेह की स्थिति में, देखें blocks विकास मार्गदर्शिका, क्योंकि dynamic blocks standard blocs की क्षमताओं को दोहराते हैं।

dynamic input की परिभाषा

Dynamic inputs dynamically बनाए गए block manifest के फ़ील्ड परिभाषित करते हैं। दूसरे शब्दों में, यह वह परिभाषा है जिसके आधार पर BlockManifest क्लास runtime में बनाई जाएगी।

प्रत्येक input निम्नलिखित properties परिभाषित कर सकता है:

  • has_default_value - यह तय करने का flag कि dynamic manifest फ़ील्ड का default है या नहीं

  • default_value - default value (केवल तब उपयोग होती है यदि has_default_value=True

  • is_optional - यह तय करने का flag कि dynamic manifest फ़ील्ड वैकल्पिक है या नहीं

  • is_dimensionality_reference - यह तय करने का flag कि dynamic manifest फ़ील्ड selector को runtime में dimensionality reference के रूप में उपयोग किया जाएगा या नहीं

  • dimensionality_offset - dynamic manifest की configured input property के लिए dimensionality offset

  • selector_types - selectors का प्रकार जो property द्वारा उपयोग किया जा सकता है (इनमें से एक input_image, step_output_image, input_parameter, step_output). Step के पास selector नहीं भी हो सकता, लेकिन तब उसे विशिष्ट प्रकार की परिभाषा प्रदान करनी होगी।

  • selector_data_kind - प्रत्येक selector type के लिए विशिष्ट selector kinds की सूची वाली dictionary

  • value_types - उस विशिष्ट प्रकार की परिभाषा जिसे manifest में रखा जाना है - यह फ़ील्ड dynamically बनाए गए manifest फ़ील्ड्स की Python types के संदर्भ में typing निर्दिष्ट करता है। प्रकारों का चयन: कोई भी, पूर्णांक, float, boolean, dict, list, strig

dynamic output की परिभाषा

outputs की परिभाषाएँ काफी सरल हैं, इनमें वैकल्पिक सूची होती है kinds जो दिए गए output के लिए घोषित होती है।

Python code की परिभाषा

Python code निम्नलिखित फ़ील्ड्स के साथ JSON दस्तावेज़ में शामिल किया जाता है:

  • run_function_code - का code run(...) आपके dynamic block की method

  • run_function_name - run function का नाम

  • init_function_code - आपकी init function के लिए वैकल्पिक code जो step state को assemble करेगी - इससे dictionary लौटने की अपेक्षा है, जो उपलब्ध होगी run() function के अंतर्गत self._init_results

  • init_function_name - init function का नाम

  • imports - अतिरिक्त imports की सूची (आप केवल अपने environment की libraries का उपयोग कर सकते हैं, कोई dependencies स्वतः स्थापित नहीं की जाएँगी)

कैसे बनाएँ run(...) method?

आपको निम्नलिखित जानना चाहिए:

  • run(...) function को इस प्रकार परिभाषित करना होगा, मानो वह class instance method हो - जिसमें पहला argument self और शेष arguments dynamic block की परिभाषा में घोषित dynamic block manifest के साथ संगत हों

  • आपको यह अपेक्षा करनी चाहिए कि baseline symbols प्रदान किए जाएँगे, जिनमें आपके import statements और निम्नलिखित शामिल हैं:

तो उदाहरण function कुछ इस प्रकार दिख सकता है (स्पष्टता के लिए, यहाँ हम Python code को अच्छी तरह फ़ॉर्मेट करके प्रस्तुत कर रहे हैं, लेकिन आपको इसे definition में रखने के लिए stringify करना होगा):

कैसे बनाएँ init(...) method?

Init function को बनाना अपेक्षित है self._init_results dictionary.

उदाहरण:

Dynamic Python block का step के रूप में उपयोग

जैसा कि example Workflow definition में दिखाया गया है, आप block का उपयोग बस ऐसे कर सकते हैं मानो वह static plugin के माध्यम से उपलब्ध सामान्य block हो:

dynamic blocks का debugging

सेट करें debug=True पर /workflows/run custom Python blocks से diagnostics capture करने के लिए request। यह opt-in है (preview runs इसे स्वतः सक्षम नहीं करते)।

stdout/stderr को capture करना। आपके block द्वारा print की गई हर चीज़ प्रति step capture की जाती है।

structured traces emit करना। A debug_traces helper आपके run(...) code (मानक imports के साथ एक baseline symbol के रूप में injected)। कोई भी JSON-serialisable मान जोड़ें; pass करें add_timestamp=True एंट्री पर timestamp लगाने के लिए:

जब debug सक्षम नहीं है (या Modal / OCI sandbox execution के अंतर्गत), debug_traces.append(...) यह एक सुरक्षित no-op है और एकत्रित नहीं किया जाता।

सफल रन (HTTP 200)। प्रतिक्रिया में निम्न शामिल होते हैं:

  • python_blocks_output_streams - step नाम के अनुसार keyed किया गया captured stdout/stderr, उदाहरणार्थ {"my_step": [{"stdout": "...", "stderr": null}]}.

  • python_blocks_debug_traces - निष्पादन क्रम में जोड़ी गई प्रविष्टियाँ, उदाहरणार्थ [{"step": "my_step", "value": {"received": 7}, "timestamp": "...", "timestamp_timezone": "UTC"}] (timestamp* केवल तब मौजूद होता है जब add_timestamp=True).

दोनों null जब debug बंद है या कुछ भी capture नहीं किया गया। केवल स्थानीय निष्पादन के लिए भरा जाता है।

असफल रन (HTTP 400)। त्रुटि प्रतिक्रिया में वही दो फ़ील्ड विफलता से पहले चलने वाले steps द्वारा उत्पन्न आंशिक output/traces के साथ, और blocks_errors[].block_traceback विफल होने वाले step के अपने stdout/stderr सहित।

अंतिम अपडेट

क्या यह उपयोगी था?