import%20marimo%0A%0A__generated_with%20%3D%20%220.14.0%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20time%0A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20numpy%20as%20np%0A%0A%20%20%20%20from%20slaf%20import%20SLAFArray%0A%20%20%20%20from%20slaf.ml.dataloaders%20import%20SLAFDataLoader%0A%20%20%20%20from%20slaf.ml.tokenizers%20import%20SLAFTokenizer%0A%0A%20%20%20%20return%20SLAFArray%2C%20SLAFDataLoader%2C%20SLAFTokenizer%2C%20mo%2C%20np%2C%20time%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%23%20SLAF%20ML%20Training%20Pipeline%0A%0A%20%20%20%20This%20notebook%20demonstrates%20how%20to%20build%20complete%20ML%20training%20pipelines%20with%20SLAF%2C%20including%3A%0A%0A%20%20%20%20-%20Streaming%20DataLoader%20with%20async%20prefetching%0A%20%20%20%20-%20PyTorch-compatible%20datasets%0A%20%20%20%20-%20Performance%20optimization%20techniques%0A%20%20%20%20-%20Custom%20training%20loop%20examples%0A%0A%20%20%20%20**Key%20Benefits%20for%20ML%20Training%3A**%0A%0A%20%20%20%20%F0%9F%92%BE%20**Memory%20Efficient**%3A%20Stream%20data%20in%20chunks%20without%20loading%20everything%20into%20memory%0A%0A%20%20%20%20%F0%9F%94%84%20**Flexible**%3A%20Support%20for%20different%20tokenization%20strategies%20(scGPT%2C%20Geneformer)%0A%0A%20%20%20%20%F0%9F%A7%AC%20**High%20Throughput**%3A%20Load%20and%20tokenize%20cells%20at%2010k%20cells%20%2F%20sec%3A%20fast%20enough%20to%20never%20let%20a%208%20x%20H100%20GPU%20node%20stay%20idle%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(SLAFArray)%3A%0A%20%20%20%20%23%20Load%20SLAF%20dataset%20for%20ML%20examples%0A%20%20%20%20slaf%20%3D%20SLAFArray(%22..%2Fslaf-datasets%2Fpbmc3k_processed.slaf%22)%0A%20%20%20%20print(f%22%E2%9C%85%20Loaded%20SLAF%20dataset%3A%20%7Bslaf.shape%5B0%5D%3A%2C%7D%20cells%20%C3%97%20%7Bslaf.shape%5B1%5D%3A%2C%7D%20genes%22)%0A%0A%20%20%20%20%23%20Show%20dataset%20info%0A%20%20%20%20slaf.info()%0A%20%20%20%20return%20(slaf%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%23%23%202.%20Tokenization%20Strategies%0A%0A%20%20%20%20SLAF%20supports%20different%20tokenization%20strategies%20for%20different%20model%20architectures.%0A%20%20%20%20Each%20strategy%20has%20its%20own%20format%20and%20vocabulary%20structure%3A%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%23%23%23%20GeneFormer%20vs%20scGPT%20Tokenization%0A%0A%20%20%20%20**GeneFormer**%3A%20Simple%20gene%20sequences%20sorted%20by%20expression%0A%20%20%20%20-%20Format%3A%20%60%5BCLS%2C%20gene1%2C%20gene2%2C%20gene3%2C%20...%2C%20SEP%5D%60%0A%20%20%20%20-%20Vocabulary%3A%20Gene%20tokens%20only%0A%20%20%20%20-%20Use%20case%3A%20Models%20that%20only%20need%20gene%20identity%0A%0A%20%20%20%20**scGPT**%3A%20Gene-expression%20pairs%20with%20special%20tokens%0A%20%20%20%20-%20Format%3A%20%60%5BCLS%2C%20gene1%2C%20expr1%2C%20gene2%2C%20expr2%2C%20...%2C%20SEP%5D%60%0A%20%20%20%20-%20Vocabulary%3A%20Gene%20tokens%20%2B%20expression%20bin%20tokens%0A%20%20%20%20-%20Use%20case%3A%20Models%20that%20need%20both%20gene%20identity%20and%20expression%20levels%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(SLAFTokenizer%2C%20slaf)%3A%0A%20%20%20%20def%20create_tokenizer()%3A%0A%20%20%20%20%20%20%20%20%23%20Ensure%20metadata%20is%20loaded%20before%20tokenization%0A%20%20%20%20%20%20%20%20print(%22%F0%9F%93%8A%20Loading%20metadata%20for%20tokenizer...%22)%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Trigger%20metadata%20loading%0A%20%20%20%20%20%20%20%20%20%20%20%20_%20%3D%20slaf.obs%0A%20%20%20%20%20%20%20%20%20%20%20%20_%20%3D%20slaf.var%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%22%20%20%20%E2%9C%85%20Metadata%20loaded%20successfully%22)%0A%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20%20%E2%9A%A0%EF%B8%8F%20Warning%3A%20Metadata%20loading%20issue%3A%20%7Be%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%22%20%20%20Continuing%20with%20tokenizer%20creation...%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Create%20tokenizer%20with%20custom%20settings%0A%20%20%20%20%20%20%20%20tokenizer%20%3D%20SLAFTokenizer(%0A%20%20%20%20%20%20%20%20%20%20%20%20slaf_array%3Dslaf%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tokenizer_type%3D%22geneformer%22%2C%20%20%23%20Explicitly%20set%20tokenizer%20type%0A%20%20%20%20%20%20%20%20%20%20%20%20vocab_size%3D2000%2C%20%20%23%20Dataset%20has%20%3C2000%20genes%0A%20%20%20%20%20%20%20%20%20%20%20%20n_expression_bins%3D20%2C%20%20%23%20More%20expression%20bins%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%23%20Get%20vocabulary%20information%0A%20%20%20%20%20%20%20%20vocab_info%20%3D%20tokenizer.get_vocab_info()%0A%20%20%20%20%20%20%20%20print(%22%E2%9C%85%20Tokenizer%20initialized%3A%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Total%20vocabulary%20size%3A%20%7Bvocab_info%5B'vocab_size'%5D%3A%2C%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Special%20tokens%3A%20%7Bvocab_info%5B'special_tokens'%5D%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Expression%20bins%3A%20%7Bvocab_info%5B'n_expression_bins'%5D%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Gene%20vocabulary%20size%3A%20%7Bvocab_info%5B'gene_vocab_size'%5D%3A%2C%7D%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Show%20special%20tokens%0A%20%20%20%20%20%20%20%20print(%22%5CnSpecial%20tokens%3A%22)%0A%20%20%20%20%20%20%20%20for%20token_name%2C%20token_id%20in%20tokenizer.special_tokens.items()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20%20%7Btoken_name%7D%3A%20%7Btoken_id%7D%22)%0A%0A%20%20%20%20%20%20%20%20return%20tokenizer%0A%0A%20%20%20%20tokenizer%20%3D%20create_tokenizer()%0A%20%20%20%20return%20(tokenizer%2C)%0A%0A%0A%40app.cell%0Adef%20_(SLAFTokenizer%2C%20slaf)%3A%0A%20%20%20%20def%20demonstrate_geneformer()%3A%0A%20%20%20%20%20%20%20%20print(%22%F0%9F%A7%AC%20GeneFormer%20Tokenization%20%26%20Decoding%22)%0A%20%20%20%20%20%20%20%20print(%22%3D%22%20*%2040)%0A%0A%20%20%20%20%20%20%20%20%23%20Ensure%20metadata%20is%20loaded%20before%20tokenization%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20_%20%3D%20slaf.obs%0A%20%20%20%20%20%20%20%20%20%20%20%20_%20%3D%20slaf.var%0A%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%E2%9A%A0%EF%B8%8F%20Warning%3A%20Metadata%20loading%20issue%3A%20%7Be%7D%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Create%20GeneFormer%20tokenizer%0A%20%20%20%20%20%20%20%20tokenizer%20%3D%20SLAFTokenizer(%0A%20%20%20%20%20%20%20%20%20%20%20%20slaf_array%3Dslaf%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tokenizer_type%3D%22geneformer%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20vocab_size%3D2000%2C%20%20%23%20Dataset%20has%20%3C2000%20genes%0A%20%20%20%20%20%20%20%20%20%20%20%20n_expression_bins%3D20%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%23%20Show%20vocabulary%20info%0A%20%20%20%20%20%20%20%20vocab_info%20%3D%20tokenizer.get_vocab_info()%0A%20%20%20%20%20%20%20%20print(%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22%E2%9C%85%20Vocabulary%3A%20%7Bvocab_info%5B'vocab_size'%5D%7D%20total%20tokens%2C%20%7Bvocab_info%5B'gene_vocab_size'%5D%7D%20genes%22%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Special%20tokens%3A%20%7Bvocab_info%5B'special_tokens'%5D%7D%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Create%20sample%20gene%20sequences%0A%20%20%20%20%20%20%20%20gene_sequences%20%3D%20%5B%5B0%2C%201%2C%202%2C%203%2C%204%5D%2C%20%5B1%2C%202%2C%203%2C%204%2C%205%5D%2C%20%5B0%2C%202%2C%204%2C%206%2C%208%5D%5D%0A%0A%20%20%20%20%20%20%20%20%23%20Tokenize%0A%20%20%20%20%20%20%20%20input_ids%2C%20attention_mask%20%3D%20tokenizer.tokenize(%0A%20%20%20%20%20%20%20%20%20%20%20%20gene_sequences%3Dgene_sequences%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20max_genes%3D50%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn%F0%9F%93%8A%20Tokenization%20Results%3A%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Input%20shape%3A%20%7Binput_ids.shape%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Attention%20mask%20shape%3A%20%7Battention_mask.shape%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20First%20sequence%20tokens%3A%20%7Binput_ids%5B0%5D.tolist()%5B%3A10%5D%7D...%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20First%20sequence%20attention%3A%20%7Battention_mask%5B0%5D.tolist()%5B%3A10%5D%7D...%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Decode%20first%20sequence%0A%20%20%20%20%20%20%20%20print(%22%5Cn%F0%9F%94%8D%20Decoding%20Results%3A%22)%0A%20%20%20%20%20%20%20%20decoded%20%3D%20tokenizer.decode_tokens(input_ids%5B0%5D.tolist())%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Sequence%20length%3A%20%7Blen(input_ids%5B0%5D)%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Genes%3A%20%7Blen(decoded%5B'genes'%5D)%7D%20genes%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20First%20few%20genes%3A%20%7Bdecoded%5B'genes'%5D%5B%3A5%5D%7D%22)%0A%0A%20%20%20%20%20%20%20%20return%20tokenizer%2C%20input_ids%2C%20attention_mask%0A%0A%20%20%20%20geneformer_tokenizer%2C%20geneformer_input_ids%2C%20geneformer_attention_mask%20%3D%20(%0A%20%20%20%20%20%20%20%20demonstrate_geneformer()%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(SLAFTokenizer%2C%20slaf)%3A%0A%20%20%20%20def%20demonstrate_scgpt()%3A%0A%20%20%20%20%20%20%20%20print(%22%F0%9F%A7%AC%20scGPT%20Tokenization%20%26%20Decoding%22)%0A%20%20%20%20%20%20%20%20print(%22%3D%22%20*%2040)%0A%0A%20%20%20%20%20%20%20%20%23%20Ensure%20metadata%20is%20loaded%20before%20tokenization%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20_%20%3D%20slaf.obs%0A%20%20%20%20%20%20%20%20%20%20%20%20_%20%3D%20slaf.var%0A%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%E2%9A%A0%EF%B8%8F%20Warning%3A%20Metadata%20loading%20issue%3A%20%7Be%7D%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Create%20scGPT%20tokenizer%0A%20%20%20%20%20%20%20%20tokenizer%20%3D%20SLAFTokenizer(%0A%20%20%20%20%20%20%20%20%20%20%20%20slaf_array%3Dslaf%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tokenizer_type%3D%22scgpt%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20vocab_size%3D2000%2C%20%20%23%20Dataset%20has%20%3C2000%20genes%0A%20%20%20%20%20%20%20%20%20%20%20%20n_expression_bins%3D20%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%23%20Show%20vocabulary%20info%0A%20%20%20%20%20%20%20%20vocab_info%20%3D%20tokenizer.get_vocab_info()%0A%20%20%20%20%20%20%20%20print(%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22%E2%9C%85%20Vocabulary%3A%20%7Bvocab_info%5B'vocab_size'%5D%7D%20total%20tokens%2C%20%7Bvocab_info%5B'gene_vocab_size'%5D%7D%20genes%22%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Special%20tokens%3A%20%7Bvocab_info%5B'special_tokens'%5D%7D%22)%0A%20%20%20%20%20%20%20%20print(%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22%20%20%20Expression%20bins%3A%20%7Bvocab_info%5B'n_expression_bins'%5D%7D%20bins%20(start%20at%20token%20%7Btokenizer.expr_bin_start%7D)%22%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%23%20Create%20sample%20gene%20and%20expression%20sequences%0A%20%20%20%20%20%20%20%20gene_sequences%20%3D%20%5B%5B0%2C%201%2C%202%5D%2C%20%5B1%2C%202%2C%203%5D%5D%0A%20%20%20%20%20%20%20%20expr_sequences%20%3D%20%5B%5B0.5%2C%200.8%2C%200.2%5D%2C%20%5B0.9%2C%200.1%2C%200.7%5D%5D%0A%0A%20%20%20%20%20%20%20%20%23%20Tokenize%0A%20%20%20%20%20%20%20%20input_ids%2C%20attention_mask%20%3D%20tokenizer.tokenize(%0A%20%20%20%20%20%20%20%20%20%20%20%20gene_sequences%3Dgene_sequences%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20expr_sequences%3Dexpr_sequences%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20max_genes%3D25%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn%F0%9F%93%8A%20Tokenization%20Results%3A%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Input%20shape%3A%20%7Binput_ids.shape%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Attention%20mask%20shape%3A%20%7Battention_mask.shape%7D%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20Expected%20length%3A%201%20%2B%202*25%20%2B%201%20%3D%2052%20(CLS%20%2B%2025*(gene%2Bexpr)%20%2B%20SEP)%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20First%20sequence%20tokens%3A%20%7Binput_ids%5B0%5D.tolist()%5B%3A10%5D%7D...%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20First%20sequence%20attention%3A%20%7Battention_mask%5B0%5D.tolist()%5B%3A10%5D%7D...%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Decode%20first%20sequence%0A%20%20%20%20%20%20%20%20print(%22%5Cn%F0%9F%94%8D%20Decoding%20Results%3A%22)%0A%20%20%20%20%20%20%20%20decoded%20%3D%20tokenizer.decode_tokens(input_ids%5B0%5D.tolist())%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Sequence%20length%3A%20%7Blen(input_ids%5B0%5D)%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Genes%3A%20%7Blen(decoded%5B'genes'%5D)%7D%20genes%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Expressions%3A%20%7Blen(decoded%5B'expressions'%5D)%7D%20expressions%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20First%20few%20genes%3A%20%7Bdecoded%5B'genes'%5D%5B%3A3%5D%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20First%20few%20expressions%3A%20%7Bdecoded%5B'expressions'%5D%5B%3A3%5D%7D%22)%0A%0A%20%20%20%20%20%20%20%20return%20tokenizer%2C%20input_ids%2C%20attention_mask%0A%0A%20%20%20%20scgpt_tokenizer%2C%20scgpt_input_ids%2C%20scgpt_attention_mask%20%3D%20demonstrate_scgpt()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%23%23%203.%20SLAF%20DataLoader%20-%20Production-Ready%20Training%0A%0A%20%20%20%20SLAF%20provides%20a%20high-performance%20DataLoader%20with%20streaming%20and%20async%20prefetching%3A%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%23%20DataLoader%20Configuration%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(SLAFDataLoader%2C%20slaf)%3A%0A%20%20%20%20def%20create_dataloader()%3A%0A%20%20%20%20%20%20%20%20%23%20Initialize%20DataLoader%0A%20%20%20%20%20%20%20%20print(%22%F0%9F%93%A6%20SLAF%20DataLoader%20Configuration%22)%0A%20%20%20%20%20%20%20%20print(%22%3D%22%20*%2040)%0A%0A%20%20%20%20%20%20%20%20%23%20Ensure%20metadata%20is%20loaded%20before%20DataLoader%20creation%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20_%20%3D%20slaf.obs%0A%20%20%20%20%20%20%20%20%20%20%20%20_%20%3D%20slaf.var%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%22%20%20%20%E2%9C%85%20Metadata%20loaded%20for%20DataLoader%22)%0A%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20%20%E2%9A%A0%EF%B8%8F%20Warning%3A%20Metadata%20loading%20issue%3A%20%7Be%7D%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Create%20DataLoader%20with%20custom%20settings%0A%20%20%20%20%20%20%20%20dataloader%20%3D%20SLAFDataLoader(%0A%20%20%20%20%20%20%20%20%20%20%20%20slaf_array%3Dslaf%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tokenizer_type%3D%22geneformer%22%2C%20%20%23%20or%20%22scgpt%22%0A%20%20%20%20%20%20%20%20%20%20%20%20batch_size%3D16%2C%20%20%23%20Small%20batch%20for%20demo%0A%20%20%20%20%20%20%20%20%20%20%20%20max_genes%3D100%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20vocab_size%3D2000%2C%20%20%23%20Dataset%20has%20%3C2000%20genes%0A%20%20%20%20%20%20%20%20%20%20%20%20n_expression_bins%3D20%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20n_epochs%3D1%2C%20%20%23%20Number%20of%20epochs%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20print(%22%E2%9C%85%20DataLoader%20initialized%3A%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Tokenizer%20type%3A%20%7Bdataloader.tokenizer_type%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Batch%20size%3A%20%7Bdataloader.batch_size%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Max%20genes%3A%20%7Bdataloader.max_genes%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Special%20tokens%3A%20%7Bdataloader.special_tokens%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Number%20of%20epochs%3A%20%7Bdataloader.n_epochs%7D%22)%0A%0A%20%20%20%20%20%20%20%20return%20dataloader%0A%0A%20%20%20%20create_dataloader()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%23%20DataLoader%20Iteration%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(SLAFDataLoader%2C%20slaf)%3A%0A%20%20%20%20def%20demonstrate_dataloader_iteration()%3A%0A%20%20%20%20%20%20%20%20%23%20Demonstrate%20DataLoader%20iteration%0A%20%20%20%20%20%20%20%20print(%22%F0%9F%94%84%20DataLoader%20Iteration%22)%0A%20%20%20%20%20%20%20%20print(%22%3D%22%20*%2025)%0A%0A%20%20%20%20%20%20%20%20%23%20Ensure%20metadata%20is%20loaded%20before%20DataLoader%20creation%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20_%20%3D%20slaf.obs%0A%20%20%20%20%20%20%20%20%20%20%20%20_%20%3D%20slaf.var%0A%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%E2%9A%A0%EF%B8%8F%20Warning%3A%20Metadata%20loading%20issue%3A%20%7Be%7D%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Create%20dataloader%0A%20%20%20%20%20%20%20%20dataloader%20%3D%20SLAFDataLoader(%0A%20%20%20%20%20%20%20%20%20%20%20%20slaf_array%3Dslaf%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tokenizer_type%3D%22geneformer%22%2C%20%20%23%20or%20%22scgpt%22%0A%20%20%20%20%20%20%20%20%20%20%20%20batch_size%3D16%2C%20%20%23%20Small%20batch%20for%20demo%0A%20%20%20%20%20%20%20%20%20%20%20%20max_genes%3D100%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20vocab_size%3D2000%2C%20%20%23%20Dataset%20has%20%3C2000%20genes%0A%20%20%20%20%20%20%20%20%20%20%20%20n_expression_bins%3D20%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20n_epochs%3D1%2C%20%20%23%20Number%20of%20epochs%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%23%20Get%20first%20batch%0A%20%20%20%20%20%20%20%20print(%221.%20First%20batch%20structure%3A%22)%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20batch%20%3D%20next(iter(dataloader))%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20key%2C%20value%20in%20batch.items()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20hasattr(value%2C%20%22shape%22)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20%20%7Bkey%7D%3A%20%7Btype(value)%7D%20with%20shape%20%7Bvalue.shape%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20%20%7Bkey%7D%3A%20%7Btype(value)%7D%20with%20length%20%7Blen(value)%7D%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Show%20batch%20details%0A%20%20%20%20%20%20%20%20%20%20%20%20input_ids%20%3D%20batch%5B%22input_ids%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20attention_mask%20%3D%20batch%5B%22attention_mask%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20cell_ids%20%3D%20batch%5B%22cell_ids%22%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%22%5Cn2.%20Batch%20details%3A%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20%20Input%20IDs%20shape%3A%20%7Binput_ids.shape%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20%20Attention%20mask%20shape%3A%20%7Battention_mask.shape%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20%20Cell%20IDs%20shape%3A%20%7Bcell_ids.shape%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20%20Data%20type%3A%20%7Binput_ids.dtype%7D%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Show%20sample%20tokens%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%22%5Cn3.%20Sample%20tokens%20from%20first%20sequence%3A%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20first_seq%20%3D%20input_ids%5B0%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20%20First%2010%20tokens%3A%20%7Bfirst_seq%5B%3A10%5D.tolist()%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20%20Sequence%20length%3A%20%7Blen(first_seq)%7D%22)%0A%0A%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%E2%9D%8C%20Error%20during%20DataLoader%20iteration%3A%20%7Be%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%20%20%20This%20might%20be%20due%20to%20metadata%20loading%20issues%20or%20dataset%20compatibility.%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20demonstrate_dataloader_iteration()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%23%20Performance%20Testing%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(SLAFDataLoader%2C%20slaf%2C%20time)%3A%0A%20%20%20%20def%20test_dataloader_performance()%3A%0A%20%20%20%20%20%20%20%20%23%20Performance%20testing%20of%20DataLoader%0A%20%20%20%20%20%20%20%20print(%22%E2%9A%A1%20DataLoader%20Performance%22)%0A%20%20%20%20%20%20%20%20print(%22%3D%22%20*%2030)%0A%0A%20%20%20%20%20%20%20%20%23%20Create%20dataloader%0A%20%20%20%20%20%20%20%20dataloader%20%3D%20SLAFDataLoader(%0A%20%20%20%20%20%20%20%20%20%20%20%20slaf_array%3Dslaf%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tokenizer_type%3D%22geneformer%22%2C%20%20%23%20or%20%22scgpt%22%0A%20%20%20%20%20%20%20%20%20%20%20%20batch_size%3D16%2C%20%20%23%20Small%20batch%20for%20demo%0A%20%20%20%20%20%20%20%20%20%20%20%20max_genes%3D100%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20vocab_size%3D2000%2C%20%20%23%20Dataset%20has%20%3C2000%20genes%0A%20%20%20%20%20%20%20%20%20%20%20%20n_expression_bins%3D20%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20n_epochs%3D1%2C%20%20%23%20Number%20of%20epochs%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%23%20Test%20iteration%20speed%0A%20%20%20%20%20%20%20%20print(%221.%20Iteration%20performance%3A%22)%0A%0A%20%20%20%20%20%20%20%20batch_count%20%3D%200%0A%20%20%20%20%20%20%20%20total_tokens%20%3D%200%0A%0A%20%20%20%20%20%20%20%20start_time%20%3D%20time.time()%0A%20%20%20%20%20%20%20%20for%20batch%20in%20dataloader%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20batch_count%20%2B%3D%201%0A%20%20%20%20%20%20%20%20%20%20%20%20total_tokens%20%2B%3D%20batch%5B%22input_ids%22%5D.shape%5B0%5D%20*%20batch%5B%22input_ids%22%5D.shape%5B1%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Only%20process%20first%20few%20batches%20for%20demo%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20batch_count%20%3E%3D%205%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%0A%0A%20%20%20%20%20%20%20%20elapsed_time%20%3D%20time.time()%20-%20start_time%0A%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Processed%20%7Bbatch_count%7D%20batches%20in%20%7Belapsed_time%3A.4f%7Ds%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Total%20tokens%3A%20%7Btotal_tokens%3A%2C%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Tokens%20per%20second%3A%20%7Btotal_tokens%20%2F%20elapsed_time%3A%2C.0f%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Batches%20per%20second%3A%20%7Bbatch_count%20%2F%20elapsed_time%3A.2f%7D%22)%0A%0A%20%20%20%20test_dataloader_performance()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%23%23%205.%20PyTorch%20Training%20Loop%20Integration%0A%0A%20%20%20%20Here's%20how%20to%20integrate%20SLAF%20DataLoader%20with%20PyTorch%20training%3A%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(SLAFDataLoader%2C%20slaf)%3A%0A%20%20%20%20def%20demonstrate_pytorch_integration()%3A%0A%20%20%20%20%20%20%20%20%23%20Demonstrate%20PyTorch%20integration%0A%20%20%20%20%20%20%20%20print(%22%F0%9F%94%A5%20PyTorch%20Training%20Loop%20Integration%22)%0A%20%20%20%20%20%20%20%20print(%22%3D%22%20*%2045)%0A%0A%20%20%20%20%20%20%20%20%23%20Reinitialize%20DataLoader%20since%20the%20previous%20one%20was%20exhausted%0A%20%20%20%20%20%20%20%20dataloader%20%3D%20SLAFDataLoader(%0A%20%20%20%20%20%20%20%20%20%20%20%20slaf_array%3Dslaf%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tokenizer_type%3D%22geneformer%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20batch_size%3D16%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20max_genes%3D100%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20vocab_size%3D2000%2C%20%20%23%20Dataset%20has%20%3C2000%20genes%0A%20%20%20%20%20%20%20%20%20%20%20%20n_expression_bins%3D20%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20n_epochs%3D1%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%23%20Check%20if%20PyTorch%20is%20available%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20import%20torch%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20TORCH_AVAILABLE%20%3D%20True%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%22%E2%9C%85%20PyTorch%20is%20available%22)%0A%20%20%20%20%20%20%20%20except%20ImportError%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20TORCH_AVAILABLE%20%3D%20False%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%22%E2%9A%A0%EF%B8%8F%20PyTorch%20not%20available%20-%20showing%20numpy-based%20approach%22)%0A%0A%20%20%20%20%20%20%20%20if%20TORCH_AVAILABLE%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%22%5Cn1.%20PyTorch%20tensor%20conversion%3A%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20batch%20%3D%20next(iter(dataloader))%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Get%20device%20info%0A%20%20%20%20%20%20%20%20%20%20%20%20from%20slaf.ml.dataloaders%20import%20get_device_info%2C%20get_optimal_device%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20device_info%20%3D%20get_device_info()%0A%20%20%20%20%20%20%20%20%20%20%20%20optimal_device%20%3D%20get_optimal_device()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20%20Device%20info%3A%20%7Bdevice_info%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20%20Using%20device%3A%20%7Boptimal_device%7D%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Convert%20to%20PyTorch%20tensors%20on%20optimal%20device%0A%20%20%20%20%20%20%20%20%20%20%20%20input_ids_tensor%20%3D%20torch.tensor(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20batch%5B%22input_ids%22%5D%2C%20dtype%3Dtorch.long%2C%20device%3Doptimal_device%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20attention_mask_tensor%20%3D%20torch.tensor(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20batch%5B%22attention_mask%22%5D%2C%20dtype%3Dtorch.bool%2C%20device%3Doptimal_device%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20cell_ids_tensor%20%3D%20torch.tensor(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20batch%5B%22cell_ids%22%5D%2C%20dtype%3Dtorch.long%2C%20device%3Doptimal_device%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%20%20%20Input%20IDs%20tensor%3A%20%7Binput_ids_tensor.shape%7D%2C%20%7Binput_ids_tensor.dtype%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%20%20%20Attention%20mask%20tensor%3A%20%7Battention_mask_tensor.shape%7D%2C%20%7Battention_mask_tensor.dtype%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%20%20%20Cell%20IDs%20tensor%3A%20%7Bcell_ids_tensor.shape%7D%2C%20%7Bcell_ids_tensor.dtype%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%22%5Cn2.%20Simple%20training%20loop%20structure%3A%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Training%20loop%20example%20with%20smart%20device%20detection%0A%20%20%20%20%20%20%20%20%20%20%20%20from%20slaf.ml.dataloaders%20import%20get_optimal_device%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20device%20%3D%20get_optimal_device()%0A%20%20%20%20%20%20%20%20%20%20%20%20model%20%3D%20YourModel(vocab_size%3Dtokenizer.get_vocab_info()%5B'vocab_size'%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20model%20%3D%20model.to(device)%20%20%23%20Move%20model%20to%20optimal%20device%0A%20%20%20%20%20%20%20%20%20%20%20%20optimizer%20%3D%20torch.optim.AdamW(model.parameters()%2C%20lr%3D1e-4)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20epoch%20in%20range(num_epochs)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20model.train()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20batch%20in%20dataloader%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20DataLoader%20already%20provides%20tensors%20on%20optimal%20device%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20input_ids%20%3D%20batch%5B%22input_ids%22%5D%20%20%23%20Already%20on%20device%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20attention_mask%20%3D%20batch%5B%22attention_mask%22%5D%20%20%23%20Already%20on%20device%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Forward%20pass%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20outputs%20%3D%20model(input_ids%3Dinput_ids%2C%20attention_mask%3Dattention_mask)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20loss%20%3D%20outputs.loss%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Backward%20pass%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20optimizer.zero_grad()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20loss.backward()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20optimizer.step()%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%22%5Cn1.%20Numpy-based%20approach%3A%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20batch%20%3D%20next(iter(dataloader))%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%20%20%20Input%20IDs%3A%20%7Bbatch%5B'input_ids'%5D.shape%7D%2C%20%7Bbatch%5B'input_ids'%5D.dtype%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%20%20%20Attention%20mask%3A%20%7Bbatch%5B'attention_mask'%5D.shape%7D%2C%20%7Bbatch%5B'attention_mask'%5D.dtype%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20%20Cell%20IDs%3A%20%7Bbatch%5B'cell_ids'%5D.shape%7D%2C%20%7Bbatch%5B'cell_ids'%5D.dtype%7D%22)%0A%0A%20%20%20%20demonstrate_pytorch_integration()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%23%23%206.%20Streaming%20Dataset%20Features%0A%0A%20%20%20%20Learn%20about%20the%20new%20streaming%20dataset%20capabilities%3A%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%23%20Async%20Prefetching%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(SLAFDataLoader%2C%20slaf)%3A%0A%20%20%20%20def%20demonstrate_streaming_features()%3A%0A%20%20%20%20%20%20%20%20print(%22%F0%9F%94%84%20Streaming%20Dataset%20Features%22)%0A%20%20%20%20%20%20%20%20print(%22%3D%22%20*%2035)%0A%0A%20%20%20%20%20%20%20%20%23%20Create%20dataloader%20with%20streaming%20features%0A%20%20%20%20%20%20%20%20dataloader%20%3D%20SLAFDataLoader(%0A%20%20%20%20%20%20%20%20%20%20%20%20slaf_array%3Dslaf%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tokenizer_type%3D%22geneformer%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20batch_size%3D8%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20max_genes%3D50%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20n_epochs%3D1%2C%20%20%23%20Single%20epoch%20for%20demo%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20print(%22%E2%9C%85%20Streaming%20features%3A%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20-%20Async%20fragment%20prefetching%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20-%20Background%20fragment%20loading%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20-%20Memory-efficient%20streaming%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20-%20PyTorch%20IterableDataset%20compatibility%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Test%20streaming%20iteration%0A%20%20%20%20%20%20%20%20print(%22%5Cn%F0%9F%94%84%20Testing%20streaming%20iteration%3A%22)%0A%20%20%20%20%20%20%20%20batch_count%20%3D%200%0A%20%20%20%20%20%20%20%20for%20batch%20in%20dataloader%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20batch_count%20%2B%3D%201%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20%20Batch%20%7Bbatch_count%7D%3A%20%7Bbatch%5B'input_ids'%5D.shape%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20batch_count%20%3E%3D%203%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%0A%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Successfully%20streamed%20%7Bbatch_count%7D%20batches%22)%0A%0A%20%20%20%20demonstrate_streaming_features()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%23%20Device%20Optimization%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(SLAFDataLoader%2C%20slaf)%3A%0A%20%20%20%20def%20demonstrate_device_optimization()%3A%0A%20%20%20%20%20%20%20%20print(%22%E2%9A%A1%20Device%20Optimization%22)%0A%20%20%20%20%20%20%20%20print(%22%3D%22%20*%2025)%0A%0A%20%20%20%20%20%20%20%20from%20slaf.ml.dataloaders%20import%20get_device_info%2C%20get_optimal_device%0A%0A%20%20%20%20%20%20%20%20%23%20Get%20device%20information%0A%20%20%20%20%20%20%20%20device_info%20%3D%20get_device_info()%0A%20%20%20%20%20%20%20%20optimal_device%20%3D%20get_optimal_device()%0A%0A%20%20%20%20%20%20%20%20print(%22%E2%9C%85%20Device%20detection%3A%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20PyTorch%20available%3A%20%7Bdevice_info%5B'torch_available'%5D%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20CUDA%20available%3A%20%7Bdevice_info%5B'cuda_available'%5D%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20MPS%20available%3A%20%7Bdevice_info%5B'mps_available'%5D%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Optimal%20device%3A%20%7Boptimal_device%7D%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Create%20dataloader%20with%20device%20optimization%0A%20%20%20%20%20%20%20%20dataloader%20%3D%20SLAFDataLoader(%0A%20%20%20%20%20%20%20%20%20%20%20%20slaf_array%3Dslaf%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tokenizer_type%3D%22geneformer%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20batch_size%3D8%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20max_genes%3D50%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20n_epochs%3D1%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn%E2%9C%85%20Device%20optimization%3A%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20-%20Automatic%20device%20detection%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20-%20Tensor%20transfer%20to%20optimal%20device%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20-%20Memory-efficient%20device%20handling%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Test%20device%20transfer%0A%20%20%20%20%20%20%20%20batch%20%3D%20next(iter(dataloader))%0A%20%20%20%20%20%20%20%20if%20hasattr(batch%5B%22input_ids%22%5D%2C%20%22device%22)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20%20Batch%20device%3A%20%7Bbatch%5B'input_ids'%5D.device%7D%22)%0A%0A%20%20%20%20demonstrate_device_optimization()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%23%23%207.%20Advanced%20Tokenization%20Features%0A%0A%20%20%20%20Explore%20advanced%20tokenization%20features%20and%20optimizations%3A%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(SLAFTokenizer%2C%20np%2C%20time%2C%20tokenizer)%3A%0A%20%20%20%20def%20demonstrate_advanced_features()%3A%0A%20%20%20%20%20%20%20%20%23%20Advanced%20tokenization%20features%0A%20%20%20%20%20%20%20%20print(%22%F0%9F%9A%80%20Advanced%20Tokenization%20Features%22)%0A%20%20%20%20%20%20%20%20print(%22%3D%22%20*%2040)%0A%0A%20%20%20%20%20%20%20%20print(%221.%20Different%20max_genes%20settings%3A%22)%0A%20%20%20%20%20%20%20%20gene_sequences%20%3D%20%5B%5Bi%2C%20i%20%2B%201%2C%20i%20%2B%202%5D%20for%20i%20in%20range(20)%5D%0A%0A%20%20%20%20%20%20%20%20for%20max_genes%20in%20%5B25%2C%2050%2C%20100%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20input_ids%2C%20attention_mask%20%3D%20tokenizer.tokenize(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gene_sequences%3Dgene_sequences%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20max_genes%3Dmax_genes%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20avg_length%20%3D%20np.mean(%5Blen(seq)%20for%20seq%20in%20input_ids%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20%20max_genes%3D%7Bmax_genes%7D%3A%20avg_length%3D%7Bavg_length%3A.1f%7D%22)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn2.%20Different%20vocabulary%20sizes%3A%22)%0A%20%20%20%20%20%20%20%20for%20vocab_size%20in%20%5B1000%2C%205000%2C%2010000%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Create%20a%20new%20tokenizer%20with%20different%20vocab%20size%0A%20%20%20%20%20%20%20%20%20%20%20%20test_tokenizer%20%3D%20SLAFTokenizer(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20slaf_array%3Dtokenizer.slaf_array%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vocab_size%3Dvocab_size%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20n_expression_bins%3D10%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20vocab_info%20%3D%20test_tokenizer.get_vocab_info()%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%20%20%20vocab_size%3D%7Bvocab_size%7D%3A%20actual_vocab%3D%7Bvocab_info%5B'vocab_size'%5D%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn3.%20Expression%20binning%20for%20scGPT%3A%22)%0A%20%20%20%20%20%20%20%20%23%20Test%20scGPT%20with%20different%20expression%20bins%0A%20%20%20%20%20%20%20%20gene_sequences%20%3D%20%5B%5B1%2C%202%2C%203%5D%2C%20%5B2%2C%203%2C%204%5D%5D%0A%20%20%20%20%20%20%20%20expr_sequences%20%3D%20%5B%5B0.5%2C%200.8%2C%200.2%5D%2C%20%5B0.9%2C%200.1%2C%200.7%5D%5D%0A%0A%20%20%20%20%20%20%20%20for%20n_bins%20in%20%5B5%2C%2010%2C%2020%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20scgpt_tokenizer%20%3D%20SLAFTokenizer(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20slaf_array%3Dtokenizer.slaf_array%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tokenizer_type%3D%22scgpt%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vocab_size%3D2000%2C%20%20%23%20Dataset%20has%20%3C2000%20genes%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20n_expression_bins%3Dn_bins%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20start_time%20%3D%20time.time()%0A%20%20%20%20%20%20%20%20%20%20%20%20input_ids%2C%20attention_mask%20%3D%20scgpt_tokenizer.tokenize(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gene_sequences%3Dgene_sequences%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20expr_sequences%3Dexpr_sequences%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20max_genes%3D25%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20elapsed_time%20%3D%20time.time()%20-%20start_time%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20%20n_expression_bins%3D%7Bn_bins%7D%3A%20%7Belapsed_time%3A.4f%7Ds%22)%0A%0A%20%20%20%20demonstrate_advanced_features()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%23%23%208.%20Memory%20and%20Performance%20Optimization%0A%0A%20%20%20%20Learn%20how%20to%20optimize%20memory%20usage%20and%20performance%20for%20large-scale%20training%3A%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(SLAFDataLoader%2C%20slaf%2C%20time)%3A%0A%20%20%20%20def%20demonstrate_memory_optimization()%3A%0A%20%20%20%20%20%20%20%20%23%20Memory%20and%20performance%20optimization%0A%20%20%20%20%20%20%20%20print(%22%F0%9F%92%BE%20Memory%20and%20Performance%20Optimization%22)%0A%20%20%20%20%20%20%20%20print(%22%3D%22%20*%2045)%0A%0A%20%20%20%20%20%20%20%20import%20gc%0A%0A%20%20%20%20%20%20%20%20import%20psutil%0A%0A%20%20%20%20%20%20%20%20def%20get_memory_usage()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22Get%20current%20memory%20usage%20in%20MB%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20process%20%3D%20psutil.Process()%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20process.memory_info().rss%20%2F%201024%20%2F%201024%0A%0A%20%20%20%20%20%20%20%20print(%221.%20Memory%20usage%20comparison%3A%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Baseline%20memory%0A%20%20%20%20%20%20%20%20gc.collect()%0A%20%20%20%20%20%20%20%20baseline_memory%20%3D%20get_memory_usage()%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Baseline%20memory%3A%20%7Bbaseline_memory%3A.1f%7D%20MB%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Memory%20with%20different%20batch%20sizes%0A%20%20%20%20%20%20%20%20for%20batch_size%20in%20%5B8%2C%2016%2C%2032%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20gc.collect()%0A%20%20%20%20%20%20%20%20%20%20%20%20start_memory%20%3D%20get_memory_usage()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20dataloader%20%3D%20SLAFDataLoader(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20slaf_array%3Dslaf%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20batch_size%3Dbatch_size%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20max_genes%3D100%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vocab_size%3D2000%2C%20%20%23%20Dataset%20has%20%3C2000%20genes%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20n_epochs%3D1%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Process%20one%20batch%0A%20%20%20%20%20%20%20%20%20%20%20%20_%20%3D%20next(iter(dataloader))%0A%20%20%20%20%20%20%20%20%20%20%20%20end_memory%20%3D%20get_memory_usage()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%20%20%20Batch%20size%20%7Bbatch_size%7D%3A%20%7Bend_memory%3A.1f%7D%20MB%20(%2B%7Bend_memory%20-%20start_memory%3A.1f%7D%20MB)%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn2.%20Performance%20with%20different%20settings%3A%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Test%20different%20configurations%0A%20%20%20%20%20%20%20%20configs%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%22batch_size%22%3A%208%2C%20%22max_genes%22%3A%2050%2C%20%22description%22%3A%20%22Small%20batches%22%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%22batch_size%22%3A%2016%2C%20%22max_genes%22%3A%20100%2C%20%22description%22%3A%20%22Medium%20batches%22%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%22batch_size%22%3A%2032%2C%20%22max_genes%22%3A%20200%2C%20%22description%22%3A%20%22Large%20batches%22%7D%2C%0A%20%20%20%20%20%20%20%20%5D%0A%0A%20%20%20%20%20%20%20%20for%20config%20in%20configs%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20dataloader%20%3D%20SLAFDataLoader(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20slaf_array%3Dslaf%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20**%7Bk%3A%20v%20for%20k%2C%20v%20in%20config.items()%20if%20k%20!%3D%20%22description%22%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20n_epochs%3D1%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20start_time%20%3D%20time.time()%0A%20%20%20%20%20%20%20%20%20%20%20%20batch_count%20%3D%200%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20_%20in%20dataloader%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20batch_count%20%2B%3D%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20batch_count%20%3E%3D%203%3A%20%20%23%20Test%20first%203%20batches%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20elapsed_time%20%3D%20time.time()%20-%20start_time%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%20%20%20%7Bconfig%5B'description'%5D%7D%3A%20%7Belapsed_time%3A.4f%7Ds%20for%20%7Bbatch_count%7D%20batches%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20demonstrate_memory_optimization()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%23%23%209.%20Production%20Training%20Workflow%0A%0A%20%20%20%20Complete%20example%20of%20a%20production-ready%20training%20workflow%3A%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(SLAFDataLoader%2C%20SLAFTokenizer%2C%20slaf)%3A%0A%20%20%20%20def%20create_production_workflow()%3A%0A%20%20%20%20%20%20%20%20%23%20Production%20training%20workflow%0A%20%20%20%20%20%20%20%20print(%22%F0%9F%8F%AD%20Production%20Training%20Workflow%22)%0A%20%20%20%20%20%20%20%20print(%22%3D%22%20*%2040)%0A%0A%20%20%20%20%20%20%20%20%23%20Create%20tokenizer%0A%20%20%20%20%20%20%20%20tokenizer%20%3D%20SLAFTokenizer(%0A%20%20%20%20%20%20%20%20%20%20%20%20slaf_array%3Dslaf%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20vocab_size%3D2000%2C%20%20%23%20Dataset%20has%20%3C2000%20genes%0A%20%20%20%20%20%20%20%20%20%20%20%20n_expression_bins%3D50%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20print(%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22%E2%9C%85%20Created%20tokenizer%20with%20%7Btokenizer.get_vocab_info()%5B'vocab_size'%5D%7D%20total%20tokens%22%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%23%20Create%20dataloaders%20(in%20production%2C%20you'd%20use%20proper%20splits)%0A%20%20%20%20%20%20%20%20train_dataloader%20%3D%20SLAFDataLoader(%0A%20%20%20%20%20%20%20%20%20%20%20%20slaf_array%3Dslaf%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tokenizer_type%3D%22geneformer%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20batch_size%3D32%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20max_genes%3D512%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20vocab_size%3D2000%2C%20%20%23%20Dataset%20has%20%3C2000%20genes%0A%20%20%20%20%20%20%20%20%20%20%20%20n_expression_bins%3D50%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20n_epochs%3D1%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20val_dataloader%20%3D%20SLAFDataLoader(%0A%20%20%20%20%20%20%20%20%20%20%20%20slaf_array%3Dslaf%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tokenizer_type%3D%22geneformer%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20batch_size%3D32%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20max_genes%3D512%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20vocab_size%3D2000%2C%20%20%23%20Dataset%20has%20%3C2000%20genes%0A%20%20%20%20%20%20%20%20%20%20%20%20n_expression_bins%3D50%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20n_epochs%3D1%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn%F0%9F%93%8A%20Production%20Setup%3A%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Batch%20size%3A%20%7Btrain_dataloader.batch_size%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Max%20genes%3A%20%7Btrain_dataloader.max_genes%7D%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Test%20production%20workflow%0A%20%20%20%20%20%20%20%20print(%22%5Cn%F0%9F%A7%AA%20Testing%20production%20workflow%3A%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Test%20training%20batch%0A%20%20%20%20%20%20%20%20train_batch%20%3D%20next(iter(train_dataloader))%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Training%20batch%20shape%3A%20%7Btrain_batch%5B'input_ids'%5D.shape%7D%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Test%20validation%20batch%0A%20%20%20%20%20%20%20%20val_batch%20%3D%20next(iter(val_dataloader))%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Validation%20batch%20shape%3A%20%7Bval_batch%5B'input_ids'%5D.shape%7D%22)%0A%0A%20%20%20%20%20%20%20%20return%20train_dataloader%2C%20val_dataloader%2C%20tokenizer%0A%0A%20%20%20%20create_production_workflow()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%23%23%2010.%20Best%20Practices%20for%20ML%20Training%0A%0A%20%20%20%20Key%20best%20practices%20for%20using%20SLAF%20in%20ML%20training%3A%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20def%20show_best_practices()%3A%0A%20%20%20%20%20%20%20%20%23%20Best%20practices%20for%20ML%20training%0A%20%20%20%20%20%20%20%20print(%22%F0%9F%92%A1%20Best%20Practices%20for%20ML%20Training%22)%0A%20%20%20%20%20%20%20%20print(%22%3D%22%20*%2040)%0A%0A%20%20%20%20%20%20%20%20print(%221.%20Tokenizer%20Configuration%3A%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20%E2%9C%85%20Choose%20appropriate%20vocab_size%20based%20on%20your%20dataset%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20%E2%9C%85%20Use%20n_expression_bins%3D50%20for%20fine-grained%20expression%20modeling%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20%E2%9C%85%20Use%20the%20correct%20tokenizer_type%20for%20your%20model%20architecture%22)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn2.%20DataLoader%20Configuration%3A%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20%E2%9C%85%20Start%20with%20small%20batch_size%20and%20increase%20gradually%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20%E2%9C%85%20Use%20max_genes%20appropriate%20for%20your%20model%20architecture%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20%E2%9C%85%20Set%20n_epochs%20for%20multi-epoch%20training%20on%20small%20datasets%22)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn3.%20Performance%20Optimization%3A%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20%E2%9C%85%20Fragment-based%20processing%20is%20much%20faster%20than%20SQL%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20%E2%9C%85%20Use%20async%20prefetching%20to%20minimize%20GPU%20idle%20time%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20%E2%9C%85%20Leverage%20device%20optimization%20for%20automatic%20tensor%20transfer%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20%E2%9C%85%20Monitor%20memory%20usage%20during%20training%22)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn4.%20Training%20Workflow%3A%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20%E2%9C%85%20Create%20separate%20train%2Fval%2Ftest%20splits%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20%E2%9C%85%20Use%20consistent%20tokenizer%20across%20splits%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20%E2%9C%85%20Implement%20proper%20error%20handling%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20%E2%9C%85%20Use%20streaming%20datasets%20for%20large%20datasets%22)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn5.%20Production%20Considerations%3A%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20%E2%9C%85%20Use%20appropriate%20batch%20sizes%20for%20your%20hardware%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20%E2%9C%85%20Implement%20checkpointing%20for%20long%20training%20runs%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20%E2%9C%85%20Monitor%20tokenization%20throughput%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20%E2%9C%85%20Consider%20distributed%20training%20for%20large%20datasets%22)%0A%0A%20%20%20%20show_best_practices()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%23%23%20Summary%0A%0A%20%20%20%20**What%20you've%20learned%20about%20SLAF%20ML%20Training%3A**%0A%0A%20%20%20%201.%20**Streaming%20DataLoader**%3A%20Async%20prefetching%20with%20PyTorch%20compatibility%0A%20%20%20%202.%20**Tokenization%20Strategies**%3A%20Geneformer%20and%20scGPT%20formats%20with%20optimized%20processing%0A%20%20%20%203.%20**Memory%20Efficiency**%3A%20Streaming%20datasets%20for%20large-scale%20training%0A%20%20%20%204.%20**Production%20Workflow**%3A%20Complete%20training%20pipeline%20setup%0A%20%20%20%205.%20**Best%20Practices**%3A%20Guidelines%20for%20optimal%20ML%20training%20performance%0A%0A%20%20%20%20**Key%20Performance%20Improvements%3A**%0A%20%20%20%20-%20Fragment%20processing%20for%20high%20throughput%0A%20%20%20%20-%20Streaming%20datasets%20with%20async%20prefetching%0A%20%20%20%20-%20Automatic%20device%20optimization%0A%20%20%20%20-%20Memory-efficient%20processing%20for%20large%20datasets%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
0d79c395042e012a9e102d66a8434daed2df58c70cceea07784127700e114d79