[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"me":3,"catalog:en:ml-engineer\u002Ftraining-infrastructure":4,"config":211},null,{"field_key":5,"field_name":6,"seniority":7,"topic_key":7,"topic_name":7,"spec_key":8,"spec_name":9,"locale":10,"cell_total":11,"field_total":12,"seniorities":13,"topics":17,"specs":115,"samples":126},"ml-engineer","ML Engineer","","training-infrastructure","Training Infrastructure","en",450,2400,[14,15,16],"junior","mid","senior",[18,22,25,28,31,34,37,40,43,46,49,52,55,58,61,64,67,70,73,76,79,82,85,88,91,94,97,100,103,106,109,112],{"key":19,"name":20,"count":21},"cml-distance-clustering-dimreduction","Cml Distance Clustering Dimreduction",75,{"key":23,"name":24,"count":21},"cml-gradient-boosting-mechanics","Cml Gradient Boosting Mechanics",{"key":26,"name":27,"count":21},"cml-linear-logistic-internals","Cml Linear Logistic Internals",{"key":29,"name":30,"count":21},"cml-probabilistic-models-calibration","Cml Probabilistic Models Calibration",{"key":32,"name":33,"count":21},"cml-svm-kernels-margins","Cml Svm Kernels Margins",{"key":35,"name":36,"count":21},"cml-trees-randomforest-internals","Cml Trees Randomforest Internals",{"key":38,"name":39,"count":21},"dl-architecture-layers","Dl Architecture Layers",{"key":41,"name":42,"count":21},"dl-initialization-optimizers","Dl Initialization Optimizers",{"key":44,"name":45,"count":21},"dl-losses-output-layers","Dl Losses Output Layers",{"key":47,"name":48,"count":21},"dl-normalization-regularization","Dl Normalization Regularization",{"key":50,"name":51,"count":21},"dl-sequence-attention","Dl Sequence Attention",{"key":53,"name":54,"count":21},"dl-training-dynamics-backprop","Dl Training Dynamics Backprop",{"key":56,"name":57,"count":21},"fe-binning-discretization","Fe Binning Discretization",{"key":59,"name":60,"count":21},"fe-categorical-encoding-mechanics","Fe Categorical Encoding Mechanics",{"key":62,"name":63,"count":21},"fe-interactions-basis-expansion","Fe Interactions Basis Expansion",{"key":65,"name":66,"count":21},"fe-numeric-transforms-distributions","Fe Numeric Transforms Distributions",{"key":68,"name":69,"count":21},"fe-temporal-cyclical-features","Fe Temporal Cyclical Features",{"key":71,"name":72,"count":21},"fe-text-highcardinality-features","Fe Text Highcardinality Features",{"key":74,"name":75,"count":21},"ml-data-preparation","Ml Data Preparation",{"key":77,"name":78,"count":21},"ml-deployment-serving","Ml Deployment Serving",{"key":80,"name":81,"count":21},"ml-experimentation-reproducibility","Ml Experimentation Reproducibility",{"key":83,"name":84,"count":21},"ml-model-selection-tuning","Ml Model Selection Tuning",{"key":86,"name":87,"count":21},"ml-model-training-evaluation","Ml Model Training Evaluation",{"key":89,"name":90,"count":21},"ml-monitoring-drift","Ml Monitoring Drift",{"key":92,"name":93,"count":21},"ml-problem-framing","Ml Problem Framing",{"key":95,"name":96,"count":21},"ml-scaling-performance","Ml Scaling Performance",{"key":98,"name":99,"count":21},"ti-checkpointing-fault-tolerance","Ti Checkpointing Fault Tolerance",{"key":101,"name":102,"count":21},"ti-cluster-scheduling-resources","Ti Cluster Scheduling Resources",{"key":104,"name":105,"count":21},"ti-distributed-strategies-sync","Ti Distributed Strategies Sync",{"key":107,"name":108,"count":21},"ti-input-pipeline-throughput","Ti Input Pipeline Throughput",{"key":110,"name":111,"count":21},"ti-throughput-profiling-bottlenecks","Ti Throughput Profiling Bottlenecks",{"key":113,"name":114,"count":21},"ti-training-determinism-numerics","Ti Training Determinism Numerics",[116,119,122,125],{"key":117,"name":118,"count":11},"classical-ml","Classical ML",{"key":120,"name":121,"count":11},"deep-learning","Deep Learning",{"key":123,"name":124,"count":11},"feature-engineering","Feature Engineering",{"key":8,"name":9,"count":11},[127,145,158,172,185,198],{"id":128,"topic":99,"difficulty":129,"body":130,"options":131,"correct_key":136,"explanation":144},"01a05d13-8bef-7b7a-8b1b-34f651abea8c",2,"A team saves checkpoints with `torch.save(model.state_dict(), path)` only, then resumes training by loading that file into a freshly constructed model plus a freshly constructed `SGD(momentum=0.9)` optimizer. What breaks first after resume?",[132,135,138,141],{"key":133,"text":134},"a","The model's forward pass produces NaN outputs immediately on the first resumed batch.",{"key":136,"text":137},"b","The optimizer has no momentum buffers yet, so early resumed steps rebuild momentum from zero.",{"key":139,"text":140},"c","Nothing breaks; SGD momentum is stored inside the model's parameters, not the optimizer.",{"key":142,"text":143},"d","The loss function silently switches to a different reduction mode after resume.","A fresh `SGD` optimizer's `state_dict()['state']` is empty until `.step()` has been called at least once, so momentum has to rebuild from scratch — the pre-crash momentum buffers were never saved because only `model.state_dict()` was persisted.",{"id":146,"topic":99,"difficulty":129,"body":147,"options":148,"correct_key":139,"explanation":157},"01a05d13-8c31-7d1d-8502-d0345c9b5f73","A job trains with a `StepLR` scheduler that has decayed the learning rate down from 0.1 to 0.025 by step 12,000. Only model and optimizer state were saved. After a crash and resume with a brand-new `StepLR` instance, what learning rate does training resume at?",[149,151,153,155],{"key":133,"text":150},"0.025, because the optimizer's `param_groups` remembers the last applied learning rate independently of the scheduler.",{"key":136,"text":152},"0.0125, because the scheduler halves the rate once more on the first resumed step.",{"key":139,"text":154},"0.1, the scheduler's base learning rate, since a new `StepLR` starts with `last_epoch=0`.",{"key":142,"text":156},"0.0, because an unsaved scheduler, lacking any restored state, defaults to a zero learning rate until re-warmed.","A newly constructed `StepLR` always begins at `last_epoch=0`, so it applies the base learning rate passed to the optimizer's constructor. Since the scheduler's own state (its step counter) wasn't checkpointed, the run silently restarts the decay schedule from the beginning at the base rate.",{"id":159,"topic":99,"difficulty":160,"body":161,"options":162,"correct_key":133,"explanation":171},"01a05d13-8c3d-7811-99b8-786b569ce022",1,"```python\nopt = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)\nprint(len(opt.state_dict()['state']))\n```\nThis line runs right after `opt` is constructed, before any `.step()` call. What does it print?",[163,165,167,169],{"key":133,"text":164},"0",{"key":136,"text":166},"The number of parameter tensors in the model.",{"key":139,"text":168},"1, since `state` holds one aggregate entry right after construction.",{"key":142,"text":170},"An error, because `state_dict()` cannot be called before the first optimization step.","An optimizer's `state` dict is populated lazily — entries (like momentum buffers) are only created the first time a parameter is updated by `.step()`. Right after construction it's an empty dict, so `len(...)` is 0.",{"id":173,"topic":99,"difficulty":160,"body":174,"options":175,"correct_key":142,"explanation":184},"01a05d13-8c41-7580-a21e-bf26a58cb7ec","Which of the following is actually stored inside `torch.amp.GradScaler`'s `state_dict()`?",[176,178,180,182],{"key":133,"text":177},"The full list of loss values observed since training started.",{"key":136,"text":179},"A copy of every gradient tensor computed in the most recent backward pass.",{"key":139,"text":181},"The optimizer's learning rate for each parameter group.",{"key":142,"text":183},"The current loss-scale factor plus the growth\u002Fbackoff factors and a growth-interval step counter.","`GradScaler.state_dict()` returns a small dict such as `{'scale', 'growth_factor', 'backoff_factor', 'growth_interval', '_growth_tracker'}` — it tracks the current scaling factor and how close it is to the next scale-up, not gradients or loss history.",{"id":186,"topic":99,"difficulty":129,"body":187,"options":188,"correct_key":136,"explanation":197},"01a05d13-8c45-74f6-85bb-dcf7d8b85b66","A model checkpoint saves only weights and optimizer state, not the RNG state. After a crash, training resumes from the same step with a fresh `torch.manual_seed(123)` call at startup, hoping to reproduce the exact same dropout masks and augmentations as before the crash. What actually happens?",[189,191,193,195],{"key":133,"text":190},"The RNG sequence is reproduced exactly, because seeding at startup reproduces the sequence from any later point in a run.",{"key":136,"text":192},"The RNG sequence diverges immediately, since re-seeding restarts the generator from zero.",{"key":139,"text":194},"PyTorch automatically stores and restores the RNG state inside `model.state_dict()`, so this concern doesn't apply.",{"key":142,"text":196},"Dropout masks are deterministic regardless of RNG state once a model is in `.train()` mode.","Re-seeding a generator with the same base seed replays the sequence from position zero, not from the point the pre-crash generator had reached after thousands of earlier draws — so the resumed run's dropout masks and augmentations no longer line up with the ones that would have followed pre-crash.",{"id":199,"topic":99,"difficulty":129,"body":200,"options":201,"correct_key":133,"explanation":210},"01a05d13-8c4c-7532-9299-74882b14087a","A checkpoint-writing routine first calls `torch.save(state, path + \".tmp\")` and, only after that completes without error, calls `os.replace(path + \".tmp\", path)`. Why write to a temporary path and rename, instead of calling `torch.save(state, path)` directly?",[202,204,206,208],{"key":133,"text":203},"If the process dies mid-write, the temp file is left incomplete — the file at `path` stays untouched.",{"key":136,"text":205},"It's required because `torch.save` cannot overwrite an existing file at the same path.",{"key":139,"text":207},"It makes the write faster, since renaming a file — unlike a full rewrite — is quicker than writing the same number of bytes twice.",{"key":142,"text":209},"It's needed only when saving on GPU tensors; CPU tensors can always be saved directly to the final path without this risk.","A rename (`os.replace`) on the same filesystem is effectively instantaneous and either fully succeeds or doesn't happen — so `path` always points to either the old, complete checkpoint or the new, complete one, never to a half-written file. Writing straight to `path` risks leaving a truncated, unreadable file there if the process dies mid-save.",{"fields":212,"seniorities":436,"interview_shapes":437,"locales":442,"oauth":444,"question_count":447,"coach_enabled":448,"jd_match_enabled":448},[213,238,258,275,299,312,331,350,372,391,406,428],{"key":214,"name_tr":215,"name_en":215,"sort":160,"specializations":216},"backend","Backend",[217,220,223,226,229,232,235],{"key":218,"name":219,"field":214},"general","Genel",{"key":221,"name":222,"field":214},"go","Go",{"key":224,"name":225,"field":214},"python","Python",{"key":227,"name":228,"field":214},"java","Java",{"key":230,"name":231,"field":214},"csharp","C#\u002F.NET",{"key":233,"name":234,"field":214},"nodejs","Node.js",{"key":236,"name":237,"field":214},"php","PHP",{"key":239,"name_tr":240,"name_en":240,"sort":129,"specializations":241},"frontend","Frontend",[242,243,246,249,252,255],{"key":218,"name":219,"field":239},{"key":244,"name":245,"field":239},"javascript","JavaScript",{"key":247,"name":248,"field":239},"typescript","TypeScript",{"key":250,"name":251,"field":239},"react","React",{"key":253,"name":254,"field":239},"vue","Vue",{"key":256,"name":257,"field":239},"angular","Angular",{"key":259,"name_tr":260,"name_en":260,"sort":261,"specializations":262},"fullstack","Fullstack",3,[263,264,265,266,267,268,269,270,271,272,273,274],{"key":218,"name":219,"field":259},{"key":221,"name":222,"field":214},{"key":224,"name":225,"field":214},{"key":227,"name":228,"field":214},{"key":230,"name":231,"field":214},{"key":233,"name":234,"field":214},{"key":236,"name":237,"field":214},{"key":244,"name":245,"field":239},{"key":247,"name":248,"field":239},{"key":250,"name":251,"field":239},{"key":253,"name":254,"field":239},{"key":256,"name":257,"field":239},{"key":276,"name_tr":277,"name_en":277,"sort":278,"specializations":279},"devops-cloud","DevOps \u002F Cloud",4,[280,281,284,287,290,293,296],{"key":218,"name":219,"field":276},{"key":282,"name":283,"field":276},"aws","AWS",{"key":285,"name":286,"field":276},"gcp","GCP",{"key":288,"name":289,"field":276},"azure","Azure",{"key":291,"name":292,"field":276},"kubernetes","Kubernetes",{"key":294,"name":295,"field":276},"terraform","Terraform",{"key":297,"name":298,"field":276},"linux","Linux",{"key":300,"name_tr":301,"name_en":301,"sort":302,"specializations":303},"ai-engineer","AI Engineer",5,[304,305,306,309],{"key":218,"name":219,"field":300},{"key":224,"name":225,"field":300},{"key":307,"name":308,"field":300},"llm-rag","LLM\u002FRAG",{"key":310,"name":311,"field":300},"mlops","MLOps",{"key":313,"name_tr":314,"name_en":315,"sort":316,"specializations":317},"database","Veritabanı","Database",6,[318,319,322,325,328],{"key":218,"name":219,"field":313},{"key":320,"name":321,"field":313},"postgresql","PostgreSQL",{"key":323,"name":324,"field":313},"mysql","MySQL",{"key":326,"name":327,"field":313},"mongodb","MongoDB",{"key":329,"name":330,"field":313},"redis","Redis",{"key":332,"name_tr":333,"name_en":334,"sort":335,"specializations":336},"mobile","Mobil","Mobile",7,[337,338,341,344,347],{"key":218,"name":219,"field":332},{"key":339,"name":340,"field":332},"ios-swift","iOS (Swift)",{"key":342,"name":343,"field":332},"android-kotlin","Android (Kotlin)",{"key":345,"name":346,"field":332},"flutter","Flutter",{"key":348,"name":349,"field":332},"react-native","React Native",{"key":351,"name_tr":352,"name_en":353,"sort":354,"specializations":355},"security","Güvenlik","Security",8,[356,357,360,363,366,369],{"key":218,"name":219,"field":351},{"key":358,"name":359,"field":351},"appsec","AppSec",{"key":361,"name":362,"field":351},"offensive-pentest","Offensive \u002F Pentest",{"key":364,"name":365,"field":351},"cloud-security","Cloud Security",{"key":367,"name":368,"field":351},"devsecops","DevSecOps",{"key":370,"name":371,"field":351},"blue-team-incident","Blue Team \u002F Incident",{"key":373,"name_tr":374,"name_en":375,"sort":376,"specializations":377},"qa-test-automation","QA \u002F Test Otomasyonu","QA \u002F Test Automation",9,[378,379,382,385,388],{"key":218,"name":219,"field":373},{"key":380,"name":381,"field":373},"test-automation","Test Automation",{"key":383,"name":384,"field":373},"sdet","SDET",{"key":386,"name":387,"field":373},"performance-testing","Performance Testing",{"key":389,"name":390,"field":373},"mobile-qa","Mobile QA",{"key":392,"name_tr":393,"name_en":393,"sort":394,"specializations":395},"data-engineer","Data Engineer",10,[396,397,400,403],{"key":218,"name":219,"field":392},{"key":398,"name":399,"field":392},"pipelines-etl","Pipelines \u002F ETL",{"key":401,"name":402,"field":392},"streaming","Streaming",{"key":404,"name":405,"field":392},"warehousing","Warehousing",{"key":407,"name_tr":408,"name_en":409,"sort":410,"specializations":411},"game-dev","Oyun Geliştirme","Game Development",11,[412,413,416,419,422,425],{"key":218,"name":219,"field":407},{"key":414,"name":415,"field":407},"unity-csharp","Unity (C#)",{"key":417,"name":418,"field":407},"unreal-cpp","Unreal (C++)",{"key":420,"name":421,"field":407},"gameplay","Gameplay",{"key":423,"name":424,"field":407},"graphics-rendering","Graphics \u002F Rendering",{"key":426,"name":427,"field":407},"multiplayer-netcode","Multiplayer \u002F Netcode",{"key":5,"name_tr":6,"name_en":6,"sort":429,"specializations":430},12,[431,432,433,434,435],{"key":218,"name":219,"field":5},{"key":117,"name":118,"field":5},{"key":123,"name":124,"field":5},{"key":120,"name":121,"field":5},{"key":8,"name":9,"field":5},[14,15,16],{"junior":438,"mid":440,"senior":441},{"questions":439,"median_sec":3},20,{"questions":439,"median_sec":3},{"questions":439,"median_sec":3},[443,10],"tr",[445,446],"google","github",28950,true]