Guix G-கோவைகளுடன் முனை-முனை சோதனைகள்
Published by Arun Isaac on
In other languages: English
Tags: guix, மென்பொருள், scheme, lisp
மென்பொருளாக்கத்தில் பன்னேரம் நம் மென்பொருள் பிற மென்பொருளுடன் சரியாக ஊடாடுகிறதாவென சோதிக்க வேண்டியிருக்கிறது. பரவலான பயன்பாடு சரியாக இருக்கிறதாவென நீங்கள் உறுதி செய்ய நினைக்கலாம். அல்லது, நீங்கள் ஆய்வாளராக இருந்தால், உங்கள் மென்பொருள் இன்னும் சென்ற ஆண்டு கொடுத்த அதே முடிவுகளைக் கொடுக்கிறதாவென உறுதி செய்ய நினைக்கலாம். இத்தகைய எளிமையான உறுதிபார்ப்பை அமைத்தல் நாம் நினைப்பதை விட அரிது.
மொழிசார் மென்பொருள் தொகுப்பு கருவிகள் (package managers) இதற்கு ஒவ்வாது
நிரலாக்கர் பலர் அவர் நிரலாக்க மொழிசார்ந்த மென்பொருள் தொகுப்பு கருவிகளையே (pip, cargo போன்றவை) பயன்படுத்துகின்றனர். இக்கருவிகள் அம்மொழி நிரலைக் கண்டறிந்தும் நிறுவவும் சிறப்புற்றிருந்தாலும் பிற மொழியில் இயற்றப்பட்ட மென்பொருள்களுடன் திணறுகின்றனர். மொழி சார்ந்து மென்பொருளைப் பாகுபடுத்தாது பொதுவாக இருக்கும் மென்பொருள் தொகுப்பு கருவியே நமக்குத் தேவை. அதுவே Guix!
உயிர்த்தகவலியலிலிருந்து ஓர் எடுத்துக்காட்டு
உயிர்த்தகவலியலிலிருந்து ஓர் எடுத்துக்காட்டைக் காண்போம். அண்மையில் Python மொழியில் இயற்றப்பட்ட pyhegp என்னும் உயிர்த்தகவலியல் நிரல் மீது வேலை செய்கிறேன். ஆனால் என் நெறியாளர் R மொழியிலேயே நிரலாக்க விரும்புபவர். அவர் முன்னர் இயற்றிய mixed-model-gwas என்னும் R மென்பொருளுடன் pyhegp சரியாக ஊடாடுகிறதாவென உறுதி செய்ய விரும்புகிறார். வெளியடப்பட்ட HSmice தரவுத்தொகுப்பை வெவ்வேறு மொழிகளில் இயற்றிய இவ்விரு மென்பொருளுக்குள் புகுத்தி வெளிவருவது சரியாக இருக்கிறதாவெனப் பார்ப்போம்.
இதை Guix G-கோவைகளில் குறிப்பிட்டு Guix பின்னணி செயலாக்கத்தை (Guix daemon) இயக்கச் செய்வோம்.
தரவைப் பதிவிறக்கல்
முதலில் தரவைப் பதிவிறக்க வேண்டும். Guix பின்னணி செயலாக்கம் பிணைய இணைப்பு இல்லாது செயலாற்றுவது. அப்போது எப்படி தரவைப் பதிவிறக்குவது? போச்சா?! இல்லை! பதிவிறக்கவேண்டிய முகவரியையும் நாம் எதிர்ப்பார்க்கும் கொத்தையும் (hash) origin பொருளில் நாம் குறிப்பிடலாம்1. இக்குறிப்பு தரவு என்ன, எங்கிருக்கிறதென மட்டும் குறிப்பிடுகிறது; அதை எப்படி பதிவிறக்கவேண்டும் என்பதைப் பற்றி எதுவும் குறிப்பிடவில்லை என்பதைக் கவனிக்க.
(define hsmice-data (origin (method url-fetch) (uri "https://ndownloader.figshare.com/files/42304248") (file-name "HSmice.tar.gz") (sha256 (base32 "1s6a83r0mll8z2lfv1b94zr2sjdrky5nyq1mpgl8fjjb5s8v2vyx"))))
தரவு சீர்பாடு (data wrangling)
எத்தரவாய்வும் தரவு சீர்பாடின்றியமையாது. ஆய்வு மென்பொருள் சரியான வடிவத்திலிருக்கும் தரவை மட்டுமே ஏற்பவை. அதனால் தரவைச் சீர்ப்படுத்த வேண்டியிருக்கிறது. இதற்கு wrangle.r என்னும் R உரைநிரலைப் பயன்படுத்துகிறோம். இதற்கு சூழல் அமைத்து இயக்கி அதன் வெளிபாட்டைப் பிடிக்கும் G-கோவையைக் கீழ் காண்க.
(define hsmice-wrangled-gexp (let ((script-profile (profile (content (packages->manifest (list gzip tar r r-dplyr r-genio r-purrr r-readr r-tibble r-tidyr)))))) (with-imported-modules '((guix build utils)) #~(begin (use-modules (guix build utils)) (mkdir #$output) (set-path-environment-variable "PATH" '("bin") '(#$script-profile)) (set-path-environment-variable "R_LIBS_SITE" '("site-library") '(#$script-profile)) (invoke "tar" "-xvf" #$hsmice-data "./HSmice/1_QTL_data/") (invoke "Rscript" #$(local-file "wrangle.r") "HSmice/1_QTL_data" #$output))))) (define hsmice-wrangled (computed-file "hsmice-wrangled" hsmice-wrangled-gexp))
pyhegp
பின் சீரான தரவை pyhegp யுள் செலுத்துகிறோம்.
(define hsmice-ciphertext-gexp (let ((script-profile (profile (content (packages->manifest (list pyhegp)))))) (with-imported-modules '((guix build utils)) #~(begin (use-modules (guix build utils) (srfi srfi-26)) (mkdir #$output) (set-path-environment-variable "PATH" '("bin") '(#$script-profile)) (for-each (cut install-file <> (getcwd)) (find-files #$hsmice-wrangled "\\.tsv$")) ;; Simple data sharing workflow (invoke "pyhegp" "encrypt" "genotype.tsv" "phenotype.tsv") (for-each (cut install-file <> #$output) (find-files (getcwd) "\\.tsv.hegp$")))))) (define hsmice-ciphertext (computed-file "hsmice-ciphertext" hsmice-ciphertext-gexp))
R mixed model GWAS உரைநிரல்
pyhegp யின் வெளிப்பாட்டை எனது நெறியாளரின் mixed model GWAS R உரைநிரலுள் செலுத்துகிறோம்.
(define hsmice-r-mixed-model-gwas-gexp (let ((gwas-script (local-file "gwas.r")) (script-profile (profile (content (packages->manifest (list r r-dplyr r-mixed-model-gwas r-qqman r-readr r-stringr r-tibble r-tidyr)))))) (with-imported-modules '((guix build utils)) #~(begin (use-modules (guix build utils)) (mkdir #$output) (set-path-environment-variable "PATH" '("bin") '(#$script-profile)) (set-path-environment-variable "R_LIBS_SITE" '("site-library") '(#$script-profile)) (invoke "Rscript" #$gwas-script #$(file-append hsmice-ciphertext "/genotype.tsv.hegp") #$(file-append hsmice-ciphertext "/phenotype.tsv.hegp") (string-append #$output "/pvalues")))))) (define hsmice-r-mixed-model-gwas (computed-file "hsmice-r-mixed-model-gwas" hsmice-r-mixed-model-gwas-gexp))
இது கீழ் காணும் Manhattan வரைபடத்தையும் அதை உருவாக்க பயன்படுத்தப்பட்ட தரவையும் தருகிறது. உயிர்த்தகவலியல் நுணுக்கங்கள் நமக்கு இப்போது தேவையில்லை. அதனால் அதில் கவனம் செலுத்த வேண்டாம்.
இறுதியாக, சரி பார்ப்பு
காதலுக்குக் கண்ணில்லையென்பர். படத்தைச் சரி பார்க்க கணினிக்கும் கண் கிடையாது! அதனால் தரவைப் படித்துச் சரியா தவறாவெனக் கூற python உரைநிரலொன்றைப் பயன்படுத்துகிறோம்.
(define hsmice-qtl-checked-gexp (let ((script-profile (profile (content (packages->manifest (list python python-pandas)))))) (with-imported-modules '((guix build utils)) #~(begin (use-modules (guix build utils)) (mkdir #$output) (set-path-environment-variable "PATH" '("bin") '(#$script-profile)) (set-path-environment-variable "GUIX_PYTHONPATH" '(#$(string-append "lib/python" (version-major+minor (package-version python)) "/site-packages")) '(#$script-profile)) (invoke "python3" #$(local-file "check-qtl.py") #$(file-append hsmice-r-mixed-model-gwas "/pvalues")))))) (define hsmice-qtl-checked (computed-file "hsmice-qtl-checked" hsmice-qtl-checked-gexp))
ஆக மொத்தம்
அனைத்தும் கோப்பிலிட்டு hsmice-qtl-checked யை guix build கொண்டு அமைத்தால்
guix build -f hsmice-test.scm
பின் வருவதைக் காணலாம். hsmice-qtl-checked சரியாக அமைக்கப்படுகிறது. அதனால் நம் சோதனை வெற்றி பெற்றதெனப் புரிந்துக் கொள்ளலாம்.
substitute: looking for substitutes on 'https://bordeaux.guix.gnu.org'... 100.0%
substitute: looking for substitutes on 'https://ci.guix.gnu.org'... 100.0%
The following derivations will be built:
/gnu/store/zdvi2dfn6g7h0ph71cqvshqc3lvbxxjh-HSmice.tar.gz.drv
/gnu/store/1yl2xh5hap9cv09hp8hixb2z7wad389w-hsmice-wrangled.drv
/gnu/store/m928lsmdbapvyw2vw04gphlw6byai95s-hsmice-ciphertext.drv
/gnu/store/a4h2vf7b9ffrrxyhb7ns3qy17ajk4wlm-hsmice-r-mixed-model-gwas.drv
/gnu/store/95i7qv0wpxm4fzw85szzx254k40babnd-hsmice-qtl-checked.drv
building /gnu/store/zdvi2dfn6g7h0ph71cqvshqc3lvbxxjh-HSmice.tar.gz.drv...
Starting download of /gnu/store/ma7kic5wd0cnry131ywd7icjhj31wqvx-HSmice.tar.gz
From https://ndownloader.figshare.com/files/42304248...
following redirection to `https://s3-eu-west-1.amazonaws.com/pstorage-ucl-2748466690/42304248/HSmice.tar.gz?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAJEPILH3NWK4LP5XQ/20250909/eu-west-1/s3/aws4_request&X-Amz-Date=20250909T204609Z&X-Amz-Expires=10&X-Amz-SignedHeaders=host&X-Amz-Signature=938b9d442a345a8488be528477b9cbfb492c3de0abfd2929f9b9ddea8af98272'...
downloading from https://ndownloader.figshare.com/files/42304248 ...
42304248 218.5MiB 8.2MiB/s 00:27 ▕██████████████████▏ 100.0%
successfully built /gnu/store/zdvi2dfn6g7h0ph71cqvshqc3lvbxxjh-HSmice.tar.gz.drv
building /gnu/store/1yl2xh5hap9cv09hp8hixb2z7wad389w-hsmice-wrangled.drv...
./HSmice/1_QTL_data/
./HSmice/1_QTL_data/HSmice.bed
./HSmice/1_QTL_data/HSmice.bim
./HSmice/1_QTL_data/HSmice.cols
./HSmice/1_QTL_data/HSmice.fam
./HSmice/1_QTL_data/HSmice.phe
Attaching package: ‘dplyr’
The following objects are masked from ‘package:stats’:
filter, lag
The following objects are masked from ‘package:base’:
intersect, setdiff, setequal, union
Reading: HSmice/1_QTL_data/HSmice.bim
Reading: HSmice/1_QTL_data/HSmice.fam
Reading: HSmice/1_QTL_data/HSmice.bed
Joining with `by = join_by(`sample-id`)`
Joining with `by = join_by(`sample-id`)`
sh: line 1: rm: command not found
environment variable `PATH' set to `/gnu/store/h46yw1vw5v4fynw3v71pjpz0kgh5kaqv-profile/bin'
environment variable `R_LIBS_SITE' set to `/gnu/store/h46yw1vw5v4fynw3v71pjpz0kgh5kaqv-profile/site-library'
successfully built /gnu/store/1yl2xh5hap9cv09hp8hixb2z7wad389w-hsmice-wrangled.drv
building /gnu/store/m928lsmdbapvyw2vw04gphlw6byai95s-hsmice-ciphertext.drv...
Dropped 1 SNP(s)
environment variable `PATH' set to `/gnu/store/ig9qqkp5rnvyr3g3dmfnsx00d9nx6l5l-profile/bin'
successfully built /gnu/store/m928lsmdbapvyw2vw04gphlw6byai95s-hsmice-ciphertext.drv
building /gnu/store/a4h2vf7b9ffrrxyhb7ns3qy17ajk4wlm-hsmice-r-mixed-model-gwas.drv...
Attaching package: ‘dplyr’
The following objects are masked from ‘package:stats’:
filter, lag
The following objects are masked from ‘package:base’:
intersect, setdiff, setequal, union
For example usage please run: vignette('qqman')
Citation appreciated but not required:
Turner, (2018). qqman: an R package for visualizing GWAS results using Q-Q and manhattan plots. Journal of Open Source Software, 3(25), 731, https://doi.org/10.21105/joss.00731.
Rows: 1527 Columns: 17
── Column specification ────────────────────────────────────────────────────────
Delimiter: "\t"
chr (1): sample-id
dbl (16): sex, Anx.resid, BurrowedPelletWeight.resid, Context.resid, End.Wei...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Rows: 10167 Columns: 1529
── Column specification ────────────────────────────────────────────────────────
Delimiter: "\t"
dbl (1529): chromosome, position, A048005080, A048006063, A048006555, A04800...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Built kinship dim 1527 1527
estimated heritability 0.545603
sh: line 1: rm: command not found
environment variable `PATH' set to `/gnu/store/9cs1wah76bsijzkh2q17hhfkp0hwyjgn-profile/bin'
environment variable `R_LIBS_SITE' set to `/gnu/store/9cs1wah76bsijzkh2q17hhfkp0hwyjgn-profile/site-library'
successfully built /gnu/store/a4h2vf7b9ffrrxyhb7ns3qy17ajk4wlm-hsmice-r-mixed-model-gwas.drv
building /gnu/store/95i7qv0wpxm4fzw85szzx254k40babnd-hsmice-qtl-checked.drv...
environment variable `PATH' set to `/gnu/store/1xvafgjm30jhz1nnwcawz7wg6a4m8mwa-profile/bin'
environment variable `GUIX_PYTHONPATH' set to `/gnu/store/1xvafgjm30jhz1nnwcawz7wg6a4m8mwa-profile/lib/python3.11/site-packages'
successfully built /gnu/store/95i7qv0wpxm4fzw85szzx254k40babnd-hsmice-qtl-checked.drv
/gnu/store/frcqzx4y6sb98iavzla19m14i2931m6a-hsmice-qtl-checked
மேற்கண்ட நிரல் துணுக்குகள் எடுக்கப்பட்ட முழு நிரலை pyhegp களஞ்சியத்திலிருக்கும் hsmice-test.scm கோப்பில் காணலாம். வருங்காலத்தில் எங்களுடன் கூடி முயலும் ஆய்வாளர் இன்னொருவர் Julia உரைநிரலொன்றை அளிக்க வாய்ப்புள்ளது. அது பன்மொழி கலப்பை இன்னும் குழப்பும். ஆனால் அதை Guix யும் G-கோவைகளும் சிறப்புற கையாளுமென்பதில் ஐயமில்லை. அத்தனை Guix மென்பொருள் தொகுப்புகளையும் உருவாக்கி பராமரிக்கும் எண்ணற்ற தொண்டருக்கு மிக்க நன்றி!2
முடிவுரை
மென்பொருள் சோதனைகளை Guix G-கோவைகள் கொண்டு ஆக்கியதால் நமக்குப் பல நன்மைகளை விளைந்துள்ளன.
இரு மொழிகளில் இயற்றப்பட்ட மென்பொருளை நன்கு ஊடாடச் செய்தோம்
python மற்றும் R என இரு மொழிகளில் இயற்றப்பட்ட மென்பொருளையும் நன்கு ஊடாடச் செய்தோம். இத்தகைய அருஞ்செயல்களை மொழிசார் மென்பொருள் தொகுப்பு நிரல்களுடன் செய்யலாகாது.
சோதனைகளைப் பற்றி வளவளவென ஆவணமாக்க வேண்டாம்
சோதனைகளை எப்படி இயக்குவது, அதற்குத் தேவையான மென்பொருளை எப்படி நிறுவுவதென வளவளவென்று ஆவணமாக்க தேவையில்லை—அனைத்துமே G-கோவைகளில் துல்லியமாக குறிப்பிடப்பட்டுள்ளது. இதனால் தொண்டர்களால் எளிதில் சோதனைகளை இயக்கிச் சரி பார்க்க முடியும்—அதனால் அவர் அதைச் செய்ய வாய்ப்பு அதிகம்.
தொடர்த் தொகுப்பு (continuous integration)
இதுப் போதாதென நமது மென்பொருள் களஞ்சியத்தை Guix அலைவரிசையாக மாற்றினால் இதேச் சோதனைகளை எவ்வித மாற்றமும் இன்றி தொடர்த் தொகுப்பு தளத்தில் இயக்கி மகிழலாம். அம்மாம் பெரிய Docker கலன்களை அங்கும் இங்கும் இழுத்துச் செல்ல தேவையில்லை. அனைத்தும் இயல் உரைக் கோப்புகளே (plain text files)!
இவ்வாறே pyhegp திட்டத்தில் செய்கிறேன். ஒவ்வொரு git பதிவிற்கும் இந்த HSmice சோதனை இயக்கப்பட்டுச் சரி பார்க்கப்படுகிறது.
எம்மென்பொருளையோ எப்பதிப்பையோ எந்த git பதிவையையோ பயன்படுத்துக
இறுதியாக, இதைப் பற்றி நான் இங்கு அதிகம் பேசாவிட்டாலும், Guix மென்பொருள் தொகுப்புகளைக் காப்பாளர் (maintainers) என்னும் மேல் வகுப்பின் பிடியிலிருந்து விடுவித்து சராசரி பயனர் கையில் வைக்கிறது. நீங்கள் எம்மென்பொருளையோ எப்பதிப்பையோ எந்த git பதிவையையோ பயன்படுத்தலாம்; அம்மென்பொருள் தொகுப்புகள் காப்பாளர் அமைத்த தொகுப்புகளுக்குச் சமமாக செயல்படும். யாருடைய அனுமதிக்கும் காத்துக் கிடக்க வேண்டாம்—உங்கள் வேலையை எத்தடையுமின்றி தொடங்கலாம், தொடரலாம்.
