[{"data":1,"prerenderedAt":737},["ShallowReactive",2],{"navigation":3,"api-navigation":184,"\u002Flearn\u002Fhow-to\u002Freproduce-experiment":206,"docyard:crossref-index":736},[4,8,155,174,180],{"title":5,"path":6,"stem":7},"Getting Started","\u002Fgetting-started","1.getting-started",{"title":9,"path":10,"stem":11,"children":12},"Learn","\u002Flearn","2.learn",[13,15,66,99,133],{"title":9,"path":10,"stem":14},"2.learn\u002Findex",{"title":16,"path":17,"stem":18,"children":19},"Tutorials","\u002Flearn\u002Ftutorials","2.learn\u002F1.tutorials\u002Findex",[20,21,26,30,34,38,42,46,50,54,58,62],{"title":16,"path":17,"stem":18},{"title":22,"path":23,"stem":24,"icon":25},"Why Laco?","\u002Flearn\u002Ftutorials\u002Fwhy-laco","2.learn\u002F1.tutorials\u002F01.why-laco","i-lucide-notebook",{"title":27,"path":28,"stem":29,"icon":25},"First Steps with Laco","\u002Flearn\u002Ftutorials\u002Ffirst-steps","2.learn\u002F1.tutorials\u002F02.first-steps",{"title":31,"path":32,"stem":33,"icon":25},"Lazy Call and Partial","\u002Flearn\u002Ftutorials\u002Flazy-call-and-partial","2.learn\u002F1.tutorials\u002F03.lazy-call-and-partial",{"title":35,"path":36,"stem":37,"icon":25},"Hyperparameters and Interpolation","\u002Flearn\u002Ftutorials\u002Fhyperparameters-and-interpolation","2.learn\u002F1.tutorials\u002F04.hyperparameters-and-interpolation",{"title":39,"path":40,"stem":41,"icon":25},"Loading, Saving, and the CLI","\u002Flearn\u002Ftutorials\u002Floading-saving-cli","2.learn\u002F1.tutorials\u002F05.loading-saving-cli",{"title":43,"path":44,"stem":45,"icon":25},"Nested Configs and Containers","\u002Flearn\u002Ftutorials\u002Fnested-configs-and-containers","2.learn\u002F1.tutorials\u002F06.nested-configs-and-containers",{"title":47,"path":48,"stem":49,"icon":25},"Typed Groups and Schemas","\u002Flearn\u002Ftutorials\u002Ftyped-groups-and-schemas","2.learn\u002F1.tutorials\u002F07.typed-groups-and-schemas",{"title":51,"path":52,"stem":53,"icon":25},"Pipeline Configs","\u002Flearn\u002Ftutorials\u002Fpipeline-configs","2.learn\u002F1.tutorials\u002F08.pipeline-configs",{"title":55,"path":56,"stem":57,"icon":25},"Tasks and the App Loop","\u002Flearn\u002Ftutorials\u002Ftasks-and-app-loop","2.learn\u002F1.tutorials\u002F09.tasks-and-app-loop",{"title":59,"path":60,"stem":61,"icon":25},"Tracing","\u002Flearn\u002Ftutorials\u002Ftracing","2.learn\u002F1.tutorials\u002F10.tracing",{"title":63,"path":64,"stem":65,"icon":25},"Production Patterns","\u002Flearn\u002Ftutorials\u002Fproduction-patterns","2.learn\u002F1.tutorials\u002F11.production-patterns",{"title":67,"path":68,"stem":69,"children":70},"Concepts","\u002Flearn\u002Fconcepts","2.learn\u002F2.concepts\u002Findex",[71,72,76,80,84,88,92,95],{"title":67,"path":68,"stem":69},{"title":73,"path":74,"stem":75},"Config as Python","\u002Flearn\u002Fconcepts\u002Fconfig-as-python","2.learn\u002F2.concepts\u002F1.config-as-python",{"title":77,"path":78,"stem":79},"Lazy Construction","\u002Flearn\u002Fconcepts\u002Flazy-construction","2.learn\u002F2.concepts\u002F2.lazy-construction",{"title":81,"path":82,"stem":83},"Lie-Typing","\u002Flearn\u002Fconcepts\u002Flie-typing","2.learn\u002F2.concepts\u002F3.lie-typing",{"title":85,"path":86,"stem":87},"Interpolation","\u002Flearn\u002Fconcepts\u002Finterpolation","2.learn\u002F2.concepts\u002F4.interpolation",{"title":89,"path":90,"stem":91},"Typed Groups","\u002Flearn\u002Fconcepts\u002Ftyped-groups","2.learn\u002F2.concepts\u002F5.typed-groups",{"title":59,"path":93,"stem":94},"\u002Flearn\u002Fconcepts\u002Ftracing","2.learn\u002F2.concepts\u002F6.tracing",{"title":96,"path":97,"stem":98},"App Loop","\u002Flearn\u002Fconcepts\u002Fapp-loop","2.learn\u002F2.concepts\u002F7.app-loop",{"title":100,"path":101,"stem":102,"children":103},"How-To Guides","\u002Flearn\u002Fhow-to","2.learn\u002F3.how-to\u002Findex",[104,105,109,113,117,121,125,129],{"title":100,"path":101,"stem":102},{"title":106,"path":107,"stem":108},"Override Configs","\u002Flearn\u002Fhow-to\u002Foverride-configs","2.learn\u002F3.how-to\u002F1.override-configs",{"title":110,"path":111,"stem":112},"Safe Loading","\u002Flearn\u002Fhow-to\u002Fsafe-loading","2.learn\u002F3.how-to\u002F2.safe-loading",{"title":114,"path":115,"stem":116},"Custom Resolvers","\u002Flearn\u002Fhow-to\u002Fcustom-resolvers","2.learn\u002F3.how-to\u002F3.custom-resolvers",{"title":118,"path":119,"stem":120},"Lint and Strict Mode","\u002Flearn\u002Fhow-to\u002Flint-and-strict","2.learn\u002F3.how-to\u002F4.lint-and-strict",{"title":122,"path":123,"stem":124},"Publishing a reproducible app with laco app","\u002Flearn\u002Fhow-to\u002Flaco-app","2.learn\u002F3.how-to\u002F5.laco-app",{"title":126,"path":127,"stem":128},"Reproduce an Experiment","\u002Flearn\u002Fhow-to\u002Freproduce-experiment","2.learn\u002F3.how-to\u002F6.reproduce-experiment",{"title":130,"path":131,"stem":132},"Migrate from argparse","\u002Flearn\u002Fhow-to\u002Fmigrate-from-argparse","2.learn\u002F3.how-to\u002F7.migrate-from-argparse",{"title":134,"path":135,"stem":136,"children":137},"Examples Curriculum","\u002Flearn\u002Fexamples","2.learn\u002F4.examples\u002Findex",[138,139,143,147,151],{"title":134,"path":135,"stem":136},{"title":140,"path":141,"stem":142},"Foundation Examples","\u002Flearn\u002Fexamples\u002Ffoundations","2.learn\u002F4.examples\u002F1.foundations",{"title":144,"path":145,"stem":146},"Building Blocks","\u002Flearn\u002Fexamples\u002Fbuilding-blocks","2.learn\u002F4.examples\u002F2.building-blocks",{"title":148,"path":149,"stem":150},"Typed-Group Variants","\u002Flearn\u002Fexamples\u002Ftyped-variants","2.learn\u002F4.examples\u002F3.typed-variants",{"title":152,"path":153,"stem":154},"End-to-End Pipelines","\u002Flearn\u002Fexamples\u002Fpipelines","2.learn\u002F4.examples\u002F4.pipelines",{"title":156,"path":157,"stem":158,"children":159},"Resources","\u002Fresources","3.resources",[160,162,166,170],{"title":156,"path":157,"stem":161},"3.resources\u002Findex",{"title":163,"path":164,"stem":165},"Integrations","\u002Fresources\u002Fintegrations","3.resources\u002F1.integrations",{"title":167,"path":168,"stem":169},"Migration guide: Laco 0.x → 1.0","\u002Fresources\u002Fmigration-0.x-to-1.0","3.resources\u002F2.migration-0.x-to-1.0",{"title":171,"path":172,"stem":173},"Laco vs hydra-zen","\u002Fresources\u002Flaco-vs-hydra-zen","3.resources\u002F3.laco-vs-hydra-zen",{"title":175,"path":176,"stem":177,"children":178},"API Reference","\u002Fapi","4.api\u002Findex",[179],{"title":175,"path":176,"stem":177},{"title":181,"path":182,"stem":183},"Lazy Configuration for Python","\u002F","index",[185,188,191,194,197,200,203],{"title":186,"path":187},"cli","\u002Fapi\u002Fcli",{"title":189,"path":190},"compat","\u002Fapi\u002Fcompat",{"title":192,"path":193},"handler","\u002Fapi\u002Fhandler",{"title":195,"path":196},"keys","\u002Fapi\u002Fkeys",{"title":198,"path":199},"language","\u002Fapi\u002Flanguage",{"title":201,"path":202},"ops","\u002Fapi\u002Fops",{"title":204,"path":205},"utils","\u002Fapi\u002Futils",{"id":207,"title":126,"body":208,"description":245,"extension":732,"meta":733,"navigation":274,"path":127,"seo":734,"stem":128,"__hash__":735},"content\u002F2.learn\u002F3.how-to\u002F6.reproduce-experiment.md",{"type":209,"value":210,"toc":724},"minimark",[211,215,234,239,417,431,435,497,504,508,516,522,526,591,594,601,691,702,720],[212,213,126],"h1",{"id":214},"reproduce-an-experiment",[216,217,218],"blockquote",{},[219,220,221,225,226,230,231],"p",{},[222,223,224],"strong",{},"See also:"," ",[227,228,229],"a",{"href":176},"API: laco.save \u002F laco.load",", ",[227,232,233],{"href":97},"Concepts: App Loop",[235,236,238],"h2",{"id":237},"save-the-config-before-training","Save the Config Before Training",[240,241,246],"pre",{"className":242,"code":243,"language":244,"meta":245,"style":245},"language-python shiki shiki-themes material-theme-lighter github-light github-dark","import laco, pathlib\n\ncfg = laco.load(\"configs\u002Ftrain.py?lr=5e-4\")\nrun_dir = pathlib.Path(\"runs\u002F2024-01-15_lr5e-4\")\nrun_dir.mkdir(parents=True, exist_ok=True)\n\nlaco.save(cfg, run_dir \u002F \"config.yaml\")\n# train…\n","python","",[247,248,249,269,276,311,338,372,377,410],"code",{"__ignoreMap":245},[250,251,254,258,262,266],"span",{"class":252,"line":253},"line",1,[250,255,257],{"class":256},"sVHd0","import",[250,259,261],{"class":260},"su5hD"," laco",[250,263,265],{"class":264},"sP7_E",",",[250,267,268],{"class":260}," pathlib\n",[250,270,272],{"class":252,"line":271},2,[250,273,275],{"emptyLinePlaceholder":274},true,"\n",[250,277,279,282,286,288,291,295,298,302,306,308],{"class":252,"line":278},3,[250,280,281],{"class":260},"cfg ",[250,283,285],{"class":284},"smGrS","=",[250,287,261],{"class":260},[250,289,290],{"class":264},".",[250,292,294],{"class":293},"slqww","load",[250,296,297],{"class":264},"(",[250,299,301],{"class":300},"sjJ54","\"",[250,303,305],{"class":304},"s_sjI","configs\u002Ftrain.py?lr=5e-4",[250,307,301],{"class":300},[250,309,310],{"class":264},")\n",[250,312,314,317,319,322,324,327,329,331,334,336],{"class":252,"line":313},4,[250,315,316],{"class":260},"run_dir ",[250,318,285],{"class":284},[250,320,321],{"class":260}," pathlib",[250,323,290],{"class":264},[250,325,326],{"class":293},"Path",[250,328,297],{"class":264},[250,330,301],{"class":300},[250,332,333],{"class":304},"runs\u002F2024-01-15_lr5e-4",[250,335,301],{"class":300},[250,337,310],{"class":264},[250,339,341,344,346,349,351,355,357,361,363,366,368,370],{"class":252,"line":340},5,[250,342,343],{"class":260},"run_dir",[250,345,290],{"class":264},[250,347,348],{"class":293},"mkdir",[250,350,297],{"class":264},[250,352,354],{"class":353},"s99_P","parents",[250,356,285],{"class":284},[250,358,360],{"class":359},"s39Yj","True",[250,362,265],{"class":264},[250,364,365],{"class":353}," exist_ok",[250,367,285],{"class":284},[250,369,360],{"class":359},[250,371,310],{"class":264},[250,373,375],{"class":252,"line":374},6,[250,376,275],{"emptyLinePlaceholder":274},[250,378,380,383,385,388,390,393,395,398,400,403,406,408],{"class":252,"line":379},7,[250,381,382],{"class":260},"laco",[250,384,290],{"class":264},[250,386,387],{"class":293},"save",[250,389,297],{"class":264},[250,391,392],{"class":293},"cfg",[250,394,265],{"class":264},[250,396,397],{"class":293}," run_dir ",[250,399,182],{"class":284},[250,401,402],{"class":300}," \"",[250,404,405],{"class":304},"config.yaml",[250,407,301],{"class":300},[250,409,310],{"class":264},[250,411,413],{"class":252,"line":412},8,[250,414,416],{"class":415},"sutJx","# train…\n",[219,418,419,422,423,426,427,430],{},[247,420,421],{},"laco.save"," writes a Hydra-compatible YAML file including the ",[247,424,425],{},"_laco_: 1","\nschema marker. All ",[247,428,429],{},"_target_"," strings, kwargs, and fully-resolved interpolations\nare preserved.",[235,432,434],{"id":433},"reload-and-reproduce","Reload and Reproduce",[240,436,438],{"className":242,"code":437,"language":244,"meta":245,"style":245},"cfg = laco.load(run_dir \u002F \"config.yaml\")\nmodel = laco.instantiate(cfg.model)\n# Identical model to the original run\n",[247,439,440,466,492],{"__ignoreMap":245},[250,441,442,444,446,448,450,452,454,456,458,460,462,464],{"class":252,"line":253},[250,443,281],{"class":260},[250,445,285],{"class":284},[250,447,261],{"class":260},[250,449,290],{"class":264},[250,451,294],{"class":293},[250,453,297],{"class":264},[250,455,316],{"class":293},[250,457,182],{"class":284},[250,459,402],{"class":300},[250,461,405],{"class":304},[250,463,301],{"class":300},[250,465,310],{"class":264},[250,467,468,471,473,475,477,480,482,484,486,490],{"class":252,"line":271},[250,469,470],{"class":260},"model ",[250,472,285],{"class":284},[250,474,261],{"class":260},[250,476,290],{"class":264},[250,478,479],{"class":293},"instantiate",[250,481,297],{"class":264},[250,483,392],{"class":293},[250,485,290],{"class":264},[250,487,489],{"class":488},"skxfh","model",[250,491,310],{"class":264},[250,493,494],{"class":252,"line":278},[250,495,496],{"class":415},"# Identical model to the original run\n",[219,498,499,500,503],{},"No ",[247,501,502],{},".py"," config file is needed: the YAML is self-contained.",[235,505,507],{"id":506},"recommended-directory-layout","Recommended Directory Layout",[240,509,514],{"className":510,"code":512,"language":513},[511],"language-text","runs\u002F\n  {run_id}\u002F\n    config.yaml      ← archived by laco.save\n    checkpoints\u002F\n      epoch_10.pt\n    metrics.jsonl\n","text",[247,515,512],{"__ignoreMap":245},[219,517,518,519,290],{},"Use a run ID that embeds the date and key hyperparameters for human readability:\n",[247,520,521],{},"2024-01-15_lr5e-4_adam",[235,523,525],{"id":524},"what-survives-serialization","What Survives Serialization",[527,528,529,542],"table",{},[530,531,532],"thead",{},[533,534,535,539],"tr",{},[536,537,538],"th",{},"Survives",[536,540,541],{},"Does not survive",[543,544,545,559,571,579],"tbody",{},[533,546,547,553],{},[548,549,550,552],"td",{},[247,551,429],{}," paths",[548,554,555,556,558],{},"Objects with no ",[247,557,429],{}," (plain instances)",[533,560,561,564],{},[548,562,563],{},"Primitive kwargs",[548,565,566,567,570],{},"Tensors wrapped with ",[247,568,569],{},"L.just"," (serialized as class path only)",[533,572,573,576],{},[548,574,575],{},"Resolved interpolations",[548,577,578],{},"Open file handles",[533,580,581,588],{},[548,582,583,584,587],{},"Nested ",[247,585,586],{},"L.call"," trees",[548,589,590],{},"Lambda functions",[219,592,593],{},"For values that don't survive, store a path, identifier, or descriptor instead.",[235,595,597,598],{"id":596},"automating-with-ltask","Automating with ",[247,599,600],{},"@L.task",[240,602,604],{"className":242,"code":603,"language":244,"meta":245,"style":245},"@L.task\ndef run(model, optimizer, num_steps=1000):\n    laco.save(cfg, run_dir \u002F \"config.yaml\")  # archive before starting\n    ...\n",[247,605,606,621,654,685],{"__ignoreMap":245},[250,607,608,612,616,618],{"class":252,"line":253},[250,609,611],{"class":610},"stp6e","@",[250,613,615],{"class":614},"sGLFI","L",[250,617,290],{"class":610},[250,619,620],{"class":614},"task\n",[250,622,623,627,630,632,635,637,640,642,645,647,651],{"class":252,"line":271},[250,624,626],{"class":625},"sbsja","def",[250,628,629],{"class":614}," run",[250,631,297],{"class":264},[250,633,489],{"class":634},"sFwrP",[250,636,265],{"class":264},[250,638,639],{"class":634}," optimizer",[250,641,265],{"class":264},[250,643,644],{"class":634}," num_steps",[250,646,285],{"class":284},[250,648,650],{"class":649},"srdBf","1000",[250,652,653],{"class":264},"):\n",[250,655,656,659,661,663,665,667,669,671,673,675,677,679,682],{"class":252,"line":278},[250,657,658],{"class":260},"    laco",[250,660,290],{"class":264},[250,662,387],{"class":293},[250,664,297],{"class":264},[250,666,392],{"class":293},[250,668,265],{"class":264},[250,670,397],{"class":293},[250,672,182],{"class":284},[250,674,402],{"class":300},[250,676,405],{"class":304},[250,678,301],{"class":300},[250,680,681],{"class":264},")",[250,683,684],{"class":415},"  # archive before starting\n",[250,686,687],{"class":252,"line":313},[250,688,690],{"class":689},"s_hVV","    ...\n",[219,692,693,694,697,698,701],{},"Or use ",[247,695,696],{},"laco.main",", which accepts a ",[247,699,700],{},"hydra.run.dir"," override:",[240,703,707],{"className":704,"code":705,"language":706,"meta":245,"style":245},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","python train.py hydra.run.dir=runs\u002Fmy_run\n","bash",[247,708,709],{"__ignoreMap":245},[250,710,711,714,717],{"class":252,"line":253},[250,712,244],{"class":713},"sbgvK",[250,715,716],{"class":304}," train.py",[250,718,719],{"class":304}," hydra.run.dir=runs\u002Fmy_run\n",[721,722,723],"style",{},"html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .slqww, html code.shiki .slqww{--shiki-light:#6182B8;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .stp6e, html code.shiki .stp6e{--shiki-light:#39ADB5;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sFwrP, html code.shiki .sFwrP{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#24292E;--shiki-default-font-style:inherit;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":245,"searchDepth":278,"depth":278,"links":725},[726,727,728,729,730],{"id":237,"depth":271,"text":238},{"id":433,"depth":271,"text":434},{"id":506,"depth":271,"text":507},{"id":524,"depth":271,"text":525},{"id":596,"depth":271,"text":731},"Automating with @L.task","md",{},{"title":126,"description":245},"kjmIXdp3nms9-bg9yRQzQV-jFQLLjNVBlePgJVeUjzs",{},1785687303080]