विषय पर बढ़ें

भाग 5: हैलो कंटेनर्स - ट्रांसक्रिप्ट

AI-सहायता प्राप्त अनुवाद - अधिक जानें और सुधार सुझाएं

महत्वपूर्ण नोट

यह पेज केवल ट्रांसक्रिप्ट दिखाता है। पूर्ण चरण-दर-चरण निर्देशों के लिए, कोर्स सामग्री पर वापस जाएं।

ट्रांसक्रिप्ट में दिखाए गए सेक्शन नंबर केवल संकेत के उद्देश्य से दिए गए हैं और हो सकता है कि सामग्री में सभी सेक्शन नंबर शामिल न हों।

स्वागत

नमस्कार, Hello Nextflow प्रशिक्षण कोर्स के भाग पाँच में आपका स्वागत है।

इस अध्याय का नाम है Hello Containers। हम बात करने वाले हैं कि कैसे Nextflow, Docker और Singularity जैसे टूल्स के साथ एकीकृत होता है ताकि software containers का उपयोग करके आपकी pipeline के उपयोगकर्ताओं को software प्रदान किया जा सके।

इसका मतलब है कि जब लोग आपकी pipeline चलाते हैं, तो उन्हें सभी अलग-अलग टूल्स खुद इंस्टॉल करने की आवश्यकता नहीं होती। Nextflow उनके लिए यह कर देगा।

कंटेनर्स एक बेहद शक्तिशाली तकनीक हैं और reproducibility और उपयोग में आसानी के लिए महत्वपूर्ण हैं। हम कंटेनर्स का एक संक्षिप्त परिचय देकर शुरुआत करेंगे, कुछ docker कमांड मैन्युअली रन करेंगे, और फिर हम उन्हीं कंटेनर्स को अपनी Nextflow pipeline में डालेंगे।

ठीक है। चलिए शुरू करते हैं।

तो पहले की तरह, आइए प्रशिक्षण सामग्री को लोड करके शुरुआत करें। training.nextflow.io पर जाएं। Hello Nextflow, अध्याय पाँच, Hello Containers।

मैं अपने Codespaces वातावरण में जाने वाला हूँ और यहाँ बाईं ओर हम hello containers dot nf देखते हैं।

पहले की तरह, यह वही स्क्रिप्ट है जो हमने पिछले अध्याय चार में समाप्त की थी, इसलिए यह परिचित दिखनी चाहिए।

हमारे पास इनपुट फ़ाइल और batch name निर्दिष्ट करने के लिए हमारे command line पैरामीटर हैं। हम अपने तीन मॉड्यूल्स को include कर रहे हैं, और हमारे पास हमारा workflow है जहाँ हम तीन processes चलाते हैं।

0. वार्मअप: hello-containers.nf चलाएं

बेझिझक इस workflow को फिर से चलाएं और दोबारा जांचें कि यह वे आउटपुट उत्पन्न कर रहा है जिनकी आप अपेक्षा करते हैं। अभी के लिए, मैं वास्तव में इसे बंद करने वाला हूँ और टर्मिनल में जाने वाला हूँ।

1. 'मैन्युअली' एक कंटेनर का उपयोग करें

इस अध्याय की शुरुआत करने के लिए, हम container तकनीक पर थोड़ा recap करने जा रहे हैं। यदि आप docker या singularity या अन्य container तकनीकों के बहुत आदी हैं, तो इसे एक refresher के रूप में लें, या बेझिझक इसे पूरी तरह से छोड़ दें।

Nextflow कई अलग-अलग प्रकार की container तकनीकों का समर्थन करता है। इसमें Docker, Singularity, Podman, Shifter, Charliecloud और अधिक शामिल हैं।

इस प्रशिक्षण में, हम Docker पर ध्यान केंद्रित करने जा रहे हैं। यह code spaces में पहले से इंस्टॉल होता है और सबसे लोकप्रिय container तकनीकों में से एक है, खासकर यदि आप अपने खुद के कंप्यूटर या अपने खुद के लैपटॉप पर विकास कर रहे हैं।

यदि आप किसी शैक्षणिक वातावरण में shared HPC पर काम कर रहे हैं, तो आपको पता चल सकता है कि Singularity उपलब्ध है और Docker नहीं। यह ठीक है। सभी अवधारणाएं बिल्कुल समान हैं। कुछ मैन्युअल कमांड अलग हैं, लेकिन यदि आप Docker को समझते हैं, तो आप singularity को भी समझेंगे।

वास्तव में, Singularity भी Code Spaces वातावरण में इंस्टॉल है। इसलिए यदि आप चाहें, तो आप Docker के बजाय Singularity का उपयोग करके समान कार्य करने का प्रयास कर सकते हैं।

ठीक है, तो container तकनीक क्या है? Docker के पीछे का विचार यह है कि यह एक remote स्रोत से एक image fetch कर सकता है। इसे अपनी local मशीन पर pull कर सकता है और फिर उस image के आधार पर एक कंटेनर बना सकता है।

यह चलने वाला कंटेनर आपके कंप्यूटर पर चलने वाली virtual machine की तरह थोड़ा है। यह आपके वातावरण से अलग है, और यह एक operating system और उपलब्ध software के एक सेट के साथ पहले से पैकेज होता है।

1.1. कंटेनर image को pull करें

हमें एक पहले से मौजूद image fetch करने के लिए जिस syntax की आवश्यकता है वह है "docker pull"। इसलिए मैं इसे अपने टर्मिनल में टाइप करने जा रहा हूँ, लेकिन अब हमें खेलने के लिए एक image की आवश्यकता है।

आप खुद images बना सकते हैं। आप उन्हें Docker Hub या quay.io जैसी public registries पर पा सकते हैं। लेकिन images जल्दी प्राप्त करने का एक बहुत अच्छा तरीका है Seqera Containers का उपयोग करना।

यह एक मुफ्त community service है जिसे हमने 2024 में बनाया है, जिसका उपयोग आप बिना login या कुछ भी किए कर सकते हैं।

यदि आप seqera.io/containers पर जाते हैं या यहाँ शीर्ष पर containers पर क्लिक करते हैं, तो आपको एक search interface मिलता है और आप Conda या Python Package Index पर उपलब्ध किसी भी टूल का नाम टाइप कर सकते हैं।

डिफ़ॉल्ट रूप से, यह Bioconda और Conda Forge channels को खोजता है, लेकिन यदि आप चाहें तो किसी भी Conda channel को prefix कर सकते हैं।

थोड़ी मज़े के लिए, आइए cowpy का उपयोग करें। मैं cowpy टाइप करने जा रहा हूँ। यह मुझे Python Package Index और Conda Forge से परिणाम देता है। मैं इसे अपने कंटेनर में जोड़ने के लिए उस पर क्लिक करने जा रहा हूँ। यदि मैं चाहता तो यहाँ कई packages जोड़ सकता था। Docker चुनें, linux/amd64 चुनें, और Get Container पर क्लिक करें।

यह मांग पर मेरे लिए image बनाता है यदि यह पहले से नहीं बनाई गई है, और मुझे एक URL देता है जिसे मैं कॉपी कर सकता हूँ।

यदि आप रुचि रखते हैं, तो आप view Build Details पर क्लिक कर सकते हैं, और यह आपको एक पेज पर ले जाता है, जो conda environment फ़ाइल दिखाता है जिसका उपयोग किया गया था और build के लिए पूर्ण build log, security scan परिणामों के साथ।

यदि मैं अपने code spaces पर वापस जाता हूँ, तो मैं अब इस container name को paste कर सकता हूँ और enter दबा सकता हूँ।

Docker अब इस container image के भीतर सभी विभिन्न layers को डाउनलोड करता है, और अब हमें बताता है कि यह image उपयोग करने के लिए उपलब्ध है।

एक Singularity image को pull करना

यदि आप singularity का उपयोग कर रहे हैं, तो प्रक्रिया मूल रूप से समान है। हम अपने image packages चुनते हैं, cowpy चुनते हैं। अब हम Docker के बजाय Singularity चुनते हैं और Get Container पर क्लिक करते हैं। यह हमें oras:// का उपयोग करके एक image URL देता है। या यदि आप पसंद करते हैं, तो आप उस box को check करके https:// का उपयोग कर सकते हैं। उस URL को कॉपी करें। अब Code Spaces पर जाएं। हमारे पास वास्तव में इस space में Apptainer इंस्टॉल है, जो Singularity के समान है, लेकिन वे एक दूसरे के लिए aliased हैं। इसलिए मैं apptainer pull करने जा रहा हूँ और फिर मैं इसे cowpy sif कहने जा रहा हूँ, लेकिन आप इसे जो चाहें कह सकते हैं। URL paste करें। और यह मेरे लिए उस image को डाउनलोड करने जा रहा है।

मैं ls -lh कर सकता था और cowpy.sif देख सकता था

Singularity, Docker से अलग है, कि singularity सभी images को flat files में store करता है, जबकि Docker की एक registry होती है जहाँ यह आपकी host मशीन पर सभी layers को अलग-अलग रखता है, और इन सब पर नज़र रखने के लिए उसके पास एक चलता हुआ demon है।

1.2. एक one-off कमांड के रूप में cowpy चलाने के लिए कंटेनर का उपयोग करें

ठीक है, चलिए Docker पर वापस जाएं। अब हम इस image को चलाने की कोशिश कर सकते हैं जिसे हमने docker run करके बनाया है।

मैं dash dash rm करने जा रहा हूँ, जो केवल image का one-off execution करता है। और मैं image URL paste करने जा रहा हूँ। और फिर अंत में, आप इसे एक कमांड के साथ समाप्त करते हैं जिसे आप चलाना चाहते हैं।

हमने जो image generate की थी उसमें cowpy इंस्टॉल था, तो चलिए cowpy को try करते हैं।

वहाँ। इसने हमारी कमांड चलाई। मेरे पास locally cowpy इंस्टॉल नहीं है। आप देख सकते हैं कि अगर मैं इसे चलाने की कोशिश करता हूँ, तो यह मौजूद नहीं है। हालाँकि, इस कमांड में, मैंने इसे Docker का उपयोग करके चलाया और इसने सही तरीके से यह आउटपुट generate किया।

1.3. cowpy को interactively चलाने के लिए कंटेनर का उपयोग करें

हम चाहें तो इससे आगे जा सकते हैं और interactively एक कंटेनर spin up कर सकते हैं और अंदर देख सकते हैं। फिर से, मैं "docker run dash dash rm" करता हूँ। अब मैं dash it करने जा रहा हूँ, जो Docker को बताता है कि हम एक interactive terminal चाहते हैं। मैं फिर से image URL करता हूँ, और इस बार, cowpy करने के बजाय, मैं bin bash करने जा रहा हूँ क्योंकि जो कमांड हम चलाना चाहते हैं वह bash है।

यह हमें इस चल रहे कंटेनर में ले जाता है और आप देख सकते हैं कि prompt अब बदल गया है।

यदि मैं LS slash करता हूँ तो आप देख सकते हैं कि यहाँ की डायरेक्टरीज अलग हैं।

यदि मैं यहाँ दाईं ओर एक दूसरा टर्मिनल खोलता हूँ, जो केवल GitHub Code Spaces में चल रहा है और LS slash करता हूँ, तो आप देखते हैं कि हमारे पास workspaces और temp जैसी डायरेक्टरीज हैं, जबकि यहाँ Docker में यह अलग है।

तो यह वातावरण Docker के भीतर पूरी तरह से अलग है और मेरे host वातावरण से अलग है। यह एक अच्छी बात है, क्योंकि यह इस कमांड के execution को Docker image में isolate करता है और इसे विभिन्न host systems पर विभिन्न लोगों के बीच reproducible बनाए रखता है।

यदि आप Docker image के भीतर अपने host system से data का उपयोग करना चाहते हैं, तो आपको कंटेनर में स्पष्ट रूप से उसे mount करना होगा।

हम एक सेकंड में ऐसा करने जा रहे हैं।

1.3.2. वांछित टूल कमांड(s) चलाएं

हालांकि पहले, आइए देखें कि क्या हम cowpy चला सकते हैं। वहाँ फिर से, कमांड अब सीधे command line पर उपलब्ध है, और हम अधिक जटिल चीजें करना और arguments pass करना शुरू कर सकते हैं। Hello containers और cow के बजाय, चलिए tux penguin करते हैं। आइए देखें हमारे पास और क्या है।

चलिए cheese करते हैं। शानदार। Dragon और Cow कैसा रहेगा? बहुत अच्छा।

1.3.3. कंटेनर से बाहर निकलें

ठीक है। मैं ज्यादा नहीं कर सकता क्योंकि मेरे पास इस कंटेनर में कोई data नहीं है। तो चलिए इस चल रही image से बाहर निकलें और देखें कि क्या हम कंटेनर में कुछ data mount कर सकते हैं। मैं control D करके या exit टाइप करके ऐसा कर सकता हूँ। ठीक है, मैं अब अपने regular GitHub code space में वापस आ गया हूँ।

1.3.4. कंटेनर में data mount करें

Docker कंटेनर में कुछ data mount करने के लिए, मुझे dash V का उपयोग करना होगा। तो मैं अपनी पिछली docker कमांड लेने जा रहा हूँ, शुरुआत में वापस जाऊंगा और dash v करूंगा। मैं वर्तमान local working डायरेक्टरी के लिए "." करने जा रहा हूँ, और फिर एक colon यह कहने के लिए कि host डायरेक्टरी में इसे कहाँ mount किया जाना चाहिए और slash data करूंगा। तो यह इस विशेष डायरेक्टरी को slash data पर कंटेनर में mount कर रहा है।

अब यदि मैं LS slash करता हूँ तो हम देख सकते हैं कि हमारे पास data नाम की एक नई डायरेक्टरी है, और यदि मैं LS data करता हूँ, तो आप सभी फ़ाइलें देख सकते हैं जो हमारे पास यहाँ sidebar में हैं। शानदार।

1.3.5. mounted data का उपयोग करें

अब हम host system पर मौजूद कुछ फ़ाइलों का उपयोग Docker image के भीतर करना शुरू कर सकते हैं। तो मैं कह सकता हूँ cat data greetings csv। यदि आपको याद है, यह पहले से हमारे विभिन्न greetings के साथ हमारी CSV फ़ाइल है, और मैं इसे cowpy में pipe कर सकता हूँ। शानदार। अब हम कहीं पहुँच रहे हैं।

ठीक है। Docker को interactively चलाने के लिए यह काफी है। उम्मीद है कि अब आपको मोटे तौर पर Docker क्या है और इसे one-off तरीके से कमांड चलाने और interactively एक image का उपयोग करने दोनों के लिए कैसे उपयोग करना है, इसका अंदाजा हो गया है। यदि आप singularity का उपयोग कर रहे हैं। सभी कमांड बहुत समान हैं सिवाय इसके कि आप apptainer exec या apptainer run, या singularity exec या singularity run जैसी चीजें करते हैं।

2. Nextflow में कंटेनर्स का उपयोग करें

आगे हम अपने Nextflow workflow में वापस जाने वाले हैं और देखने वाले हैं कि Nextflow pipeline के भीतर इस तकनीक का उपयोग कैसे करें।

चलिए टर्मिनल बंद करें और Hello Containers को फिर से खोलें।

2.1. एक cowpy मॉड्यूल लिखें

अपने cowpy उदाहरण के साथ बने रहने के लिए, चलिए अपने workflow में एक नया process बनाएं, जो cowpy का उपयोग करता है। चलिए modules पर जाएं, एक नई फ़ाइल बनाएं और इसे cowpy nf कहें। मैं अब थोड़ा धोखा देने वाला हूँ और प्रशिक्षण सामग्री से code को कॉपी करने जा रहा हूँ और save दबाऊंगा। और चलिए एक नज़र डालते हैं।

तो यह एक सरल process है। उम्मीद है कि अब आप समझ गए हैं कि एक process के building blocks कैसे दिखते हैं। हमारा publishDir फिर से है, results में जा रहा है। हमारे पास दो inputs हैं, एक input फ़ाइल और character नाम की एक string। हमारे पास एक आउटपुट cowpy input फ़ाइल है, और हमारे पास एक script है जो बिल्कुल वैसी ही दिखती है जैसी हमने एक सेकंड पहले अपनी docker image के अंदर मैन्युअली चलाई थी: एक फ़ाइल को print करने के लिए cat, इसे cowpy पर pipe करना, यह बताना कि हम किस प्रकार का cowpy character उपयोग करना चाहते हैं, और उसे output फ़ाइल में आउटपुट करना, जिसे हम यहाँ आउटपुट के रूप में pass करते हैं।

2.2. workflow में cowpy जोड़ें

ठीक है, चलिए अपने workflow में वापस जाएं, इस नए process को import करें। तो cowpy, modules cowpy nf से। चलिए एक नया पैरामीटर बनाएं ताकि हम निर्दिष्ट कर सकें कि हम कौन सा character चाहते थे। चलिए डिफ़ॉल्ट रूप से Turkey कहें। और फिर चलिए workflow के अंत में इस नए process को call करें,

cowpy। और चलिए यहाँ Collect Greetings के आउटपुट का उपयोग करें। तो collect greetings out, यहाँ out file। और फिर हमें एक दूसरे argument की आवश्यकता है, जो हमने अभी बनाया नया params है। params dot character।

2.2.4. यह सत्यापित करने के लिए workflow चलाएं कि यह काम करता है

ठीक है, आइए देखें कि हमारा नया process काम करता है या नहीं। Nextflow run hello containers। इसे उन पहली तीन processes को चलाना चाहिए और फिर अंत में cowpy चलाने की कोशिश करनी चाहिए।

हमें एक error मिली है। यहाँ जो कह रहा है, cowpy में एक error थी और इसमें exit status 127 था और निश्चित रूप से, कमांड sh cowpy command not found।

हमने Nextflow को नहीं बताया कि हमारे पास cowpy के लिए एक Docker image उपलब्ध है, इसलिए इसने इसे हमारे host system पर चलाने की कोशिश की और हमारे host system पर cowpy इंस्टॉल नहीं है, इसलिए इसने एक error ट्रिगर की।

2.3. इसे चलाने के लिए एक कंटेनर का उपयोग करें

तो हमें जो करना है वह यह है कि हमें Nextflow को बताना है कि हमारे पास एक कंटेनर उपलब्ध है। चलिए अपने cowpy process में जाएं और हम process के शीर्ष पर container नामक एक नया निर्देश जोड़ने जा रहे हैं।

फिर हम अपनी image ढूंढते हैं, URL कॉपी करते हैं, और उसे एक string में डालते हैं।

यह अपने आप में पर्याप्त नहीं है क्योंकि एक X Flow pipeline में software निर्दिष्ट करने के कई तरीके हो सकते हैं। मैं conda conda-forge cowpy भी कर सकता था, उदाहरण के लिए। और Nextflow को यह जानना होगा कि आप इनमें से कौन सी तकनीक का उपयोग करना चाहते हैं।

2.3.2. nextflow.config फ़ाइल के माध्यम से Docker के उपयोग को सक्षम करें

इसलिए Docker सक्षम के साथ चलाने के लिए, हम खुद से थोड़ा आगे जाने वाले हैं और Nextflow config फ़ाइल का उपयोग करने जा रहे हैं, जो कुछ ऐसा है जिसे हम अगले अध्याय में अधिक विस्तार से कवर करने जा रहे हैं। आप इस डायरेक्टरी में देख सकते हैं कि हमारे पास Nextflow Config नाम की एक फ़ाइल है, और यहाँ आपके पास पहले से docker.enabled False है।

हम इसे True में बदलने जा रहे हैं ताकि Docker सक्षम हो, और फिर हम workflow को फिर से चलाने की कोशिश कर सकते हैं।

2.3.3. Docker सक्षम के साथ workflow चलाएं

Nextflow run hello containers nf और इस बार cowpy सफलतापूर्वक चली। चलिए Results में देखें। cowpy collected test और वहाँ हमारा Turkey है। शानदार।

तो पृष्ठभूमि में वहाँ, Nextflow जानता था कि उसके पास उस process के लिए एक कंटेनर उपलब्ध है।

इसने image को fetch किया और इसने हमारे लिए कमांड्स चलाईं।

2.3.4. निरीक्षण करें कि Nextflow ने containerized कार्य को कैसे launch किया

यदि आप उत्सुक हैं, तो हम वास्तव में देख सकते हैं कि इसने वास्तव में क्या किया work डायरेक्टरी में देखकर। यदि मैं code work करता हूँ, और फिर hash और फिर command run, जो यदि आपको याद है तो वह actual फ़ाइल है जो उस कार्य के लिए execute की जाती है, हम अंदर जा सकते हैं और हम NXF launch नामक एक function की तलाश कर सकते हैं। और यहाँ आप exact docker कमांड देख सकते हैं जिसका Nextflow ने उपयोग किया, जो बहुत कुछ उस तरह दिखता है जो हम पहले टर्मिनल में मैन्युअली कर रहे थे। Docker run। इस host डायरेक्टरी को कंटेनर में bind करना, और फिर container URL निर्दिष्ट करना।

तो यहाँ कोई जादू नहीं है। यह सिर्फ इतना है कि Nextflow स्वचालित रूप से आपके लिए भारी उठाने का काम कर रहा है इस तरह से कि आप आसानी से अपनी pipeline में कंटेनर्स निर्दिष्ट कर सकते हैं, जो फिर किसी और के लिए उपयोग करने के लिए आसानी से उपलब्ध हैं जो आपके workflow को चलाता है। और उन लोगों को अब आपकी analysis pipeline चलाने के लिए software प्रबंधित करने के बारे में सोचने की आवश्यकता नहीं है।

बहुत, बहुत सरल, बहुत सुविधाजनक, और वास्तव में reproducible भी। चारों ओर अच्छा।

ठीक है, बहुत अच्छा काम। यह अध्याय पाँच का अंत है। अगले वीडियो में हमसे जुड़ें भाग छह के लिए, जो इस Hello Nextflow प्रशिक्षण का अंतिम भाग है, जहाँ हम Nextflow configuration के बारे में अधिक विस्तार से बात करेंगे।

अगले वीडियो में मिलते हैं।

अगला वीडियो ट्रांसक्रिप्ट