Bölüm 1: Nextflow'u Çalıştırma¶
Yapay zeka destekli çeviri - daha fazla bilgi ve iyileştirme önerileri
Bu bölümde, Nextflow pipeline'larını çalıştırmanın temel kavramlarını tanıtıyoruz. Basit bir Hello World iş akışıyla başlayıp, konteynerler kullanarak birden fazla girdiyi paralel olarak işleyen eksiksiz, çok adımlı bir pipeline'a kadar ilerliyoruz.
1. Hello World¶
1-hello.nf iş akışı, bir komut satırı argümanı aracılığıyla bir selamlama alır ve bunu bir dosyaya yazar.
1.1. İş akışını başlatma¶
Terminalinizde aşağıdaki komutu çalıştırın.
Komut çıktısı
Çıktıdaki en önemli satır, süreç durum satırıdır:
Bu satır, sayHello sürecinin bir kez başarıyla çalıştığını gösterir.
[6d/740edd] öneki, görevin çalışma dizinine giden kısaltılmış bir yoldur — bununla ilgili daha fazla bilgi aşağıda verilmektedir.
Ardından gelen Outputs: bloğu, pipeline'ın yayımladığı her dosyayı listeler; etiketler, aşağıdaki 1.4 bölümünde ele alınan output bloğuna göre belirlenir.
1.2. Çıktıyı bulma¶
Bu iş akışı, çıktısını bir results dizinine yayımlamak üzere yapılandırılmıştır.
Çalıştırmanın ardından çıktıyı orada bulabilirsiniz:
Dosyayı açarak Hello World! içerdiğini doğrulayın.
1.3. work/ dizinini keşfetme¶
Arka planda Nextflow, work/ adlı bir dizin içinde her süreç çağrısı için benzersiz bir görev dizini oluşturur.
Konsol çıktısında gösterilen hash ([6d/740edd]), bu dizine giden yoldur.
İçeride çıktı dosyasının yanı sıra birkaç gizli log dosyası bulacaksınız:
.command.sh: Nextflow'un çalıştırdığı tam komut.command.out/.command.err: süreçten gelen stdout ve stderr.command.log: birleşik log çıktısı.exitcode: sürecin çıkış kodu
.command.sh dosyası, hata ayıklama sırasında özellikle kullanışlıdır — tam olarak neyin çalıştırıldığını gösterir.
1.4. İsteğe bağlı: Kod incelemesi¶
Yalnızca pipeline çalıştırmak istiyorsanız kodu anlamak zorunlu değildir; ancak merak ediyorsanız incelemeye değer.
Bu alıştırmayla ilişkili kodu keşfetmek için tıklayın
1-hello.nf dosyasını açalım ve ana bileşenlerine bakalım.
| 1-hello.nf | |
|---|---|
Şunları görüyoruz:
- bir
processmodülüne işaret edenincludeifadesi - pipeline parametrelerini tanımlayan
paramsbloğu - yapılacak işi tanımlayan
workflowbloğu - çıktılarla ne yapılacağını belirten
outputbloğu
Her birine sırayla bakalım.
process modülü¶
include ifadesi, Nextflow'a ayrı bir kod dosyasından sayHello adlı bir şeyi yüklemesini söyler.
| 1-hello.nf | |
|---|---|
O dosyada, sayHello adlı bir sürecin tanımını buluruz:
| modules/sayHello.nf | |
|---|---|
Bir process, pipeline'daki tek bir adımı tanımlar.
Girdilerini, çıktılarını ve çalıştırılacak betiği bildirir.
val niteleyicisi, girdinin düz bir değer (string, sayı vb.) olduğu anlamına gelir.
path niteleyicisi ise çıktının bir dosya yolu olduğu anlamına gelir.
Süreç tanımını ana iş akışı dosyasına yazmak mümkündür; ancak bunları ayrı modül dosyalarında tutmak yeniden kullanılabilirliklerini sağlar: aynı modül birden fazla iş akışı betiği tarafından içe aktarılabilir.
params bloğu¶
params bloğu, iş akışının kabul ettiği komut satırı parametrelerini bildirir:
Burada bildirilen her parametre, komut satırında çift tire (--input) ile kullanılabilir hale gelir.
Desteklenen türler şunlardır: String, Integer, Float, Boolean ve Path.
İpucu
İş akışı parametreleri, Nextflow'un kendi CLI bayraklarından (tek tire kullanan, örn. -resume) ayırt edilmek için her zaman iki tire (--input) kullanır.
workflow bloğu¶
workflow bloğu, veri akışı mantığını tanımlar: hangi süreçlerin çalıştırılacağını ve hangi sırayla.
| 1-hello.nf | |
|---|---|
Burada yalnızca bir süreç çağrıldığından oldukça basittir; daha gerçekçi örnekleri ilerleyen bölümlerde ele alacağız.
main: bölümü, sayHello sürecini --input değeriyle çağırır.
publish: bölümü ise hangi çıktıların results dizinine kopyalanacağını listeler.
output bloğu¶
Dosyanın alt kısmındaki output bloğu, hedef yolu ve kopyalama modunu belirtir.
Her adlandırılmış giriş, iş akışındaki bir publish: etiketine karşılık gelir ve onu results/ altındaki bir alt dizine eşler.
Özetle¶
Bir Nextflow pipeline'ını nasıl çalıştıracağınızı ve çıktılarını nasıl bulacağınızı öğrendiniz; ayrıca işin work/ altındaki görev dizinlerinde yürütüldüğünü öğrendiniz.
Sırada ne var?¶
Nextflow'un birden fazla girdiyi nasıl verimli bir şekilde işlediğini keşfedin.
2. Birden fazla girdiyi işleme¶
Gerçek dünya pipeline'ları genellikle yalnızca bir değil, pek çok veri parçasını işler.
2-inputs.nf iş akışı bir CSV dosyasından okur ve her satır için sayHello'yu paralel olarak bir kez çalıştırır.
Önce iş akışını çalıştıralım, ardından Nextflow'un bu birden fazla girdiyi işlemek için hangi mekanizmayı kullandığına bakalım.
2.1. İş akışını çalıştırma¶
Terminalinizde aşağıdaki komutu çalıştırın.
Komut çıktısı
N E X T F L O W ~ version 26.04.4
Launching `2-inputs.nf` [nauseous_babbage] revision: b90778224d
executor > local (3)
[66/de7844] sayHello (3) | 3 of 3 ✔
Outputs:
/workspaces/training/nextflow-run/results
first_output:
- 2-inputs/Bonjour-output.txt
- 2-inputs/Hello-output.txt
- 2-inputs/Hola-output.txt
3 of 3 ifadesi, sayHello sürecinin CSV'deki her satır için bir kez olmak üzere üç kez çağrıldığını gösterir.
results dizininde artık her selamlama için bir tane olmak üzere üç çıktı dosyası görmelisiniz:
Her birinin bir selamlama içerdiğini doğrulamak için çıktı dosyalarından herhangi birini açın.
Yukarıdaki özet çıktı, sayHello için tek bir özet satırı gösterse de Nextflow aslında arka planda üç ayrı görev yürütmesi başlattı; CSV'deki her satır için bir tane ve makinenizin kaynakları elverdiği anda bunları paralel olarak çalıştırdı.
1.3 bölümünde incelediğiniz tek görevde olduğu gibi, bu üç yürütmenin her biri work/ altında kendi görev dizinini alır ve diğerlerinden tamamen yalıtılmış olur:
work
├── 2d/276c63.../
│ ├── .command.sh
│ └── Hola-output.txt
├── ab/007682.../
│ ├── .command.sh
│ └── Bonjour-output.txt
└── d9/2476082.../
├── .command.sh
└── Hello-output.txt
Her .command.sh yalnızca o tek selamlama için komutu içerir:
Bu yalıtım, paralel yürütmeyi güvenli kılan şeydir: aynı anda çalışan üç görev hiçbir zaman bir çalışma dizinini paylaşmaz; dolayısıyla bir görevin yazdığı şey, aynı ada sahip dosyalar üretilse bile başka bir görevin yazdığıyla çakışamaz veya onu üzerine yazamaz.
Aynı zamanda -resume'un (bir sonraki konuda ele alınacak) bireysel görevleri bağımsız olarak önbelleğe alıp yeniden kullanabilmesinin de nedeni budur: her görevin girdileri, çıktıları ve logları tamamen kendi dizininde bulunur; görevler arasında senkronizasyonu bozabilecek hiçbir şey paylaşılmaz.
2.2. İş akışını -ansi-log false ile yeniden çalıştırma¶
Nextflow varsayılan olarak çıktıyı her süreç için tek bir özet satırına sıkıştırır.
Her süreç çağrısının ayrı ayrı listelenmesini görmek için -ansi-log false ekleyin:
Komut çıktısı
N E X T F L O W ~ version 26.04.4
Launching `2-inputs.nf` [extravagant_bardeen] - revision: b90778224d
[43/0bac1c] Submitted process > sayHello (1)
[2d/99f604] Submitted process > sayHello (2)
[6d/7578d7] Submitted process > sayHello (3)
Outputs:
/workspaces/training/nextflow-run/results
first_output:
- 2-inputs/Hello-output.txt
- 2-inputs/Bonjour-output.txt
- 2-inputs/Hola-output.txt
Bu, üç süreç çağrısının tamamını ve her biri için oluşturulan benzersiz work alt dizinini gösterir.
2.3. Tamamlanan işi atlamak için -resume kullanma¶
Şimdi iki selamlama daha ekleyen genişletilmiş girdi dosyasına geçin ve komut satırına -resume ekleyin:
Komut çıktısı
N E X T F L O W ~ version 26.04.4
Launching `2-inputs.nf` [adoring_mayer] revision: b90778224d
executor > local (2)
[84/2f3067] sayHello (5) | 5 of 5, cached: 3 ✔
Outputs:
/workspaces/training/nextflow-run/results
first_output:
- 2-inputs/Bonjour-output.txt
- 2-inputs/Ciao-output.txt
- 2-inputs/Hello-output.txt
- 2-inputs/Hola-output.txt
- 2-inputs/Ola-output.txt
Nextflow yalnızca iki yeni girdiyi çalıştırdı. Önceki çalıştırmada işlenen üç selamlama önbelleğe alındı ve otomatik olarak yeniden kullanıldı.
Bu özellik, çok adımlı bir pipeline'da zaten başarıyla çalıştırılmış adımların yeniden yürütülmesini atlamak için de işe yarar. Örneğin, bir pipeline çalıştırması sistem hatası nedeniyle kesintiye uğradıysa ya da geliştirme aşamasındaki bir pipeline'a yeni adımlar eklediyseniz.
-resume özelliği, uzun pipeline'larda özellikle değerlidir; hatadan kurtarma, kritik zaman ve kaynak tasarrufu sağlayabilir.
2.4. İsteğe bağlı: Kod incelemesi¶
Yalnızca pipeline çalıştırmak istiyorsanız kodu anlamak zorunlu değildir; ancak merak ediyorsanız incelemeye değer.
Bu alıştırmayla ilişkili kodu keşfetmek için tıklayın
2-inputs.nf dosyasındaki temel değişiklik, iş akışının main: bölümündedir:
| 2-inputs.nf | |
|---|---|
Burada gördüğünüz şeye kanal denir: işlemleri paralelleştirmeyi kolaylaştıracak şekilde girdi verilerini işleyen bir kuyruk yapısıdır.
channel.fromPath(params.input),--inputile verilen dosya yolundan bir kanal oluşturur.splitCsv(), CSV'yi satırlara ayrıştırır.map { line -> line[0] }, her satırdan ilk sütunu çıkarır
Sonuç, Hello, Bonjour ve Hola değerlerini içeren bir kanaldır.
sayHello(greeting_ch)'ye geçirildiğinde, Nextflow her öğe için süreci otomatik olarak bir kez çağırır ve kaynaklar elverdiğinde bunları paralel olarak çalıştırır.
Özetle¶
Bir CSV dosyasından birden fazla girdiyi paralel olarak nasıl işleyeceğinizi ve tamamlanan işi tekrarlamamak için -resume'u nasıl kullanacağınızı öğrendiniz.
Sırada ne var?¶
Eksiksiz bir çok adımlı pipeline'ın süreçleri kanallar aracılığıyla nasıl birbirine zincirlediğini ve analiz araçlarıyla bağımlılıklarını yönetmek için konteynerleri nasıl kullanacağınızı öğrenin.
3. Çok adımlı bir pipeline çalıştırma¶
Şimdiye kadar tek bir süreci çalıştırdınız, ardından bir dizi girdi üzerinde paralel olarak birden fazla kez çalıştırdınız.
Gerçek pipeline'lar genellikle daha ileri gider: birkaç süreci birbirine zincirler, birinin çıktısını bir sonrakine besler ve çoğunlukla birden fazla yazılım parçasına dayanır.
main.nf iş akışı, bunların ikisini de eksiksiz bir pipeline'da bir araya getirir.
Her girdi selamlama dört adımın tamamından geçer: sayHello onu bir dosyaya yazar, convertToUpper metni büyük harfe dönüştürür, collectGreetings tüm sonuçları tek bir dosyada birleştirir ve cowpy birleştirilmiş çıktıdan konteynerize bir araç kullanarak ASCII sanatı oluşturur.
Nextflow bu adımları kanallarla birbirine bağlar: bir sürecin çıktısı bir sonrakinin girdisi olur; böylece veriler hazır hale geldikçe tüm zincir otomatik olarak çalışır ve her adımı elle düzenlemenize gerek kalmaz.
Bu iş akışının modüller kullandığını unutmayın: her süreç modules/ altında kendi dosyasında tanımlanmıştır ve main.nf bunları satır içi tanımlamak yerine include ifadeleriyle içe aktarır.
Bu, her süreci kod tekrarı olmadan birden fazla iş akışında yeniden kullanılabilir kılar. Daha fazla bilgi için aşağıdaki kod inceleme bölümüne bakın.
3.1. İş akışını çalıştırma¶
Terminalinizde aşağıdaki komutu çalıştırın.
character parametresi nextflow.config dosyasında varsayılan olarak turkey değerine ayarlanmıştır; bu nedenle siz geçersiz kılmadıkça ASCII sanatı bir hindi kullanır (deneyin: --character tux ekleyin).
Komut çıktısı
N E X T F L O W ~ version 26.04.4
Launching `main.nf` [nostalgic_brahmagupta] revision: ce74f81996
executor > local (8)
[56/8499f6] sayHello (3) | 3 of 3 ✔
[cc/0ee42a] convertToUpper (3) | 3 of 3 ✔
[eb/0f2e24] collectGreetings | 1 of 1 ✔
[b5/34e07f] cowpy | 1 of 1 ✔
Outputs:
/workspaces/training/nextflow-run/results
first_output:
- batch/intermediates/Bonjour-output.txt
- batch/intermediates/Hello-output.txt
- batch/intermediates/Hola-output.txt
uppercased:
- batch/intermediates/UPPER-Bonjour-output.txt
- batch/intermediates/UPPER-Hello-output.txt
- batch/intermediates/UPPER-Hola-output.txt
collected: batch/intermediates/COLLECTED-batch-output.txt
batch_report: batch/batch-report.txt
cowpy_art: batch/cowpy-COLLECTED-batch-output.txt
Dört süreç çalıştı; ancak hepsi aynı sayıda değil.
sayHello ve convertToUpper her girdi için bir kez çalıştı (3 of 3): her selamlama ayrı ayrı yazılıp büyük harfe dönüştürülmesi gerekir.
collectGreetings ve cowpy yalnızca bir kez çalıştı (1 of 1): selamlamaları birleştirmek ve ASCII sanatı oluşturmak, ancak tüm bireysel sonuçlar hazır olduğunda anlam ifade eder.
Birkaç paralel görevin daha az sayıda aşağı akış görevine beslenmesi şeklindeki bu yelpaze açılıp kapanma biçimi, gerçek pipeline'larda yaygındır.
Nextflow, bir sonraki adımı başlatmadan önce tüm adımın bitmesini beklemez.
Bir sayHello çıktısı hazır olur olmaz, eşleşen convertToUpper görevi başlayabilir; böylece farklı süreçlerdeki görevler katı gruplar halinde değil, eş zamanlı olarak çalışır.
collectGreetings ve cowpy ise beklemek zorundadır; zira her ikisi de tüm yukarı akış sonuçlarının önce mevcut olmasına bağlıdır.
results dizini bu yelpaze kapanmasını ve pipeline yazarının neyi nereye yayımlamayı seçtiğini yansıtır: bu yapıyı tanımlayan şeyin 1.4 bölümündeki kod incelemesindeki output bloğu olduğunu hatırlayın.
results
└── batch
├── batch-report.txt
├── cowpy-COLLECTED-batch-output.txt
└── intermediates
├── Bonjour-output.txt
├── COLLECTED-batch-output.txt
├── Hello-output.txt
├── Hola-output.txt
├── UPPER-Bonjour-output.txt
├── UPPER-Hello-output.txt
└── UPPER-Hola-output.txt
Üst düzey dizin, varsayılan olarak batch olan batch parametresinden adını alır; ilerleyen alıştırmalarda değiştiğini göreceksiniz.
ASCII sanat dosyası için cowpy-COLLECTED-batch-output.txt dosyasını kontrol edin.
Dosya içeriği
_________
/ HELLO \
| BONJOUR |
\ HOLA /
---------
\ ,+*^^*+___+++_
\ ,*^^^^ )
\ _+* ^**+_
\ +^ _ _++*+_+++_, )
_+^^*+_ ( ,+*^ ^ \+_ )
{ ) ( ,( ,_+--+--, ^) ^\
{ (\@) } f ,( ,+-^ __*_*_ ^^\_ ^\ )
{:;-/ (_+*-+^^^^^+*+*<_ _++_)_ ) ) /
( / ( ( ,___ ^*+_+* ) < < \
U _/ ) *--< ) ^\-----++__) ) ) )
( ) _(^)^^)) ) )\^^^^^))^*+/ / /
( / (_))_^)) ) ) ))^^^^^))^^^)__/ +^^
( ,/ (^))^)) ) ) ))^^^^^^^))^^) _)
*+__+* (_))^) ) ) ))^^^^^^))^^^^^)____*^
\ \_)^)_)) ))^^^^^^^^^^))^^^^)
(_ ^\__^^^^^^^^^^^^))^^^^^^^)
^\___ ^\__^^^^^^))^^^^^^^^)\\
^^^^^\uuu/^^\uuu/^^^^\^\^\^\^\^\^\^\
___) >____) >___ ^\_\_\_\_\_\_\)
^^^//\\_^^//\\_^ ^(\_\_\_\)
^^^ ^^ ^^^ ^
2.1 bölümünde olduğu gibi, dört süreçteki bu 8 görev yürütmesinin her biri work/ altında kendi dizinini alır ve diğerlerinden tamamen yalıtılmış olur.
collectGreetings, bunun neden önemli olduğunun iyi bir örneğidir: üç farklı görev dizininde bulunan convertToUpper görevlerinin üçünün de çıktılarına bağlıdır; bu nedenle Nextflow, collectGreetings'in yukarı akış görevlerinin dizinlerinden doğrudan okuması yerine, bu dosyalara sembolik bağlantıları collectGreetings'in kendi dizinine yerleştirir:
COLLECTED-batch-output.txt
UPPER-Bonjour-output.txt -> ../../69/e6c057.../UPPER-Bonjour-output.txt
UPPER-Hello-output.txt -> ../../cc/ba7d19.../UPPER-Hello-output.txt
UPPER-Hola-output.txt -> ../../cc/0ee42a.../UPPER-Hola-output.txt
batch-report.txt
.command.sh
Her görev yalnızca ihtiyaç duyduğu belirli dosyaları görür; nereden geldiklerinden bağımsız olarak, başka bir görevin dizininin iç içeriğini asla görmez. Tüm bir pipeline boyunca, 2.1 bölümünde tek bir süreçle gördüğünüz aynı yalıtım, Nextflow'un her süreçteki her görevi eş zamanlı ve güvenli bir şekilde çalıştırmasını sağlar.
Not
cowpy adımı, yerel olarak yüklü yazılıma güvenmek yerine bir Docker konteyneri içinde çalışır.
Bir konteyner, bir uygulamayı çalışması için gereken her şeyle birlikte paketler; böylece bağımlılıkları kendiniz yükleyip yönetmek zorunda kalmazsınız ve pipeline, konteyneri çalıştırabilen herhangi bir makinede aynı şekilde davranır.
Nextflow, konteynerler için alternatif olarak Conda'yı da destekler; aralarında nasıl geçiş yapılacağını öğrenmek için Bölüm 2'ye bakın.
3.2. İsteğe bağlı: Kod incelemesi¶
Yalnızca pipeline çalıştırmak istiyorsanız kodu anlamak zorunlu değildir; ancak merak ediyorsanız incelemeye değer.
Bu alıştırmayla ilişkili kodu keşfetmek için tıklayın
Verinin bir adımdan diğerine nasıl aktığı¶
Her süreç, çıktı kanalını bir sonrakine geçirir:
processName.out kalıbı, bir sürecin çıktı kanalına atıfta bulunur.
.collect() operatörü, convertToUpper'dan gelen tüm bireysel çıktıları collectGreetings'e geçirmeden önce tek bir kanal öğesinde toplar.
Süreç modüllerini kullanma¶
main.nf doğrudan herhangi bir süreç kodu tanımlamaz.
Bunun yerine, her süreci modules/ altındaki kendi dosyasından içe aktarır:
| main.nf | |
|---|---|
Her modül dosyası, 1.4 bölümündeki sayHello modülüyle aynı şekilde yapılandırılmış tek bir süreç tanımı içerir.
Süreçleri ayrı dosyalarda tutmak, kod tekrarı olmadan birden fazla iş akışında yeniden kullanılabilir olmalarını sağlar.
Konteynerize yazılım kullanma¶
cowpy süreci, modül dosyasında belirtilen bir Docker konteyneri içinde çalışır:
| modules/cowpy.nf | |
|---|---|
Nextflow imajı otomatik olarak çeker, betiği konteyner içinde çalıştırır ve ardından temizlik yapar.
Docker, bu proje için nextflow.config dosyasında etkinleştirilmiştir:
Bu tek satır, pipeline'daki konteyner belirtilmiş herhangi bir süreç için Docker'ı etkinleştirir.
Özetle¶
Konteynerize bir araç kullanarak birden fazla girdiyi paralel olarak işleyen eksiksiz bir çok adımlı pipeline çalıştırdınız.
Sırada ne var?¶
nextflow.config kullanarak pipeline davranışını nasıl yapılandıracağınızı öğreneceğiniz Bölüm 2'ye geçin.
Özet¶
Bu bölümde şunları öğrendiniz:
- Bir Nextflow iş akışını çalıştırmak ve çıktılarını bulmak
work/dizinini ve log dosyalarını keşfetmek- Bir CSV dosyasından birden fazla girdiyi paralel olarak işlemek
- Yeni girdiler eklerken tamamlanan işi atlamak için
-resumekullanmak - Konteynerize bir araç kullanan çok adımlı bir pipeline çalıştırmak