# FaultInjection **Repository Path**: qiangge123a/fault-injection ## Basic Information - **Project Name**: FaultInjection - **Description**: fault injection for pytorch by torch_distpatch - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 1 - **Created**: 2024-04-24 - **Last Updated**: 2024-12-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 故障注入工具 ## 项目介绍 模型训练过程中,在指定位置(step,codeline,module,aten/c10d api)注入错误,模拟精度问题,以研究精度问题的影响和解决方案。 ## Dependency - pytorch>= 2.0 ## 代码示例 开启故障注入只需要在训练脚本中加2行代码,模型初始化后,创建一个Injector,在配置文件中指定故障注入的目标。 如果训练过程涉及梯度累积, 需要指定每一步的micro batch数量。 ```python from FaultInjection import Injector model = ... injector = Injector('injector.json', model = model, micro_batch_per_step=k) ``` 配置文件示例: ```json { "targets": ["addmm", "t"], "modules": ["layer.layers"], "code":["run.py[83]"], "steps": [4], "error_type": "light", "direction": "both" } ``` ### 指定step `step`指定注入的时间。如上的配置下,`injector`会在step 1-4时处于开启状态,期间对训练性能有较大影响。TODO: 在不连续的step之间都进行开关。 ### 指定模型中的位置 `modules`,`code`两个字段指定注入的位置。两者为**与**的关系。待注入的范围是两者范围的交集。 指定范围调用到的(blacklist之外的)api会在日志中以`"{module}*{step}*{api}*{调用次数}"`的形式记录。对于有多个输出的api也会有提示,后续targets可以指定到api的特定输出。 调用次数指在一个step中,第几次调用当前api。如果设置了grad accumulate,micro_batch等参数,则在多个micro step间会累积,直到更新一次参数后(实际是`optimizer.zero_grad()`),再重新计数。 #### modules `modules`指代`model`中的`named_module`, `injector`会在第一个指定step记录所有modules,因此在不清楚模型结构的情况下,可以设置steps为[0],启动训练脚本观察模型结构。为空列表时,不进行注入。 ```plain // "steps": [0] INFO:root:current step 0. Restart counting INFO:root:starting INFO:root:----------module names of the model---------- INFO:root:act INFO:root:layer INFO:root:layer.layers INFO:root:layer.layers.0 INFO:root:norm INFO:root:out INFO:root:forward start ... ``` ```plain // modules: ["layer", "ababa"] ERROR:root:some of the target modules: ababa do not exist in the model. Check the modules. INFO:root:layer.layers.5*step0*sigmoid*3 INFO:root:layer.layers.6*step0*t*4 INFO:root:layer.layers.6*step0*addmm*4 INFO:root:layer.out*step0*t*5 INFO:root:layer.out*step0*addmm*5 INFO:root:forward ended. Expecting to forward loss function INFO:root:loss function*step0*nll_loss_forward*1 INFO:root:output is tuple, types are Tensor|Tensor INFO:root:loss function*step0*nll_loss_backward*1 INFO:root:backward start INFO:root:layer.out*step0*t*11 INFO:root:layer.out*step0*mm*3 INFO:root:layer.out*step0*t*12 INFO:root:layer.out*step0*mm*4 INFO:root:layer.out*step0*t*13 INFO:root:layer.out*step0*sum*2 INFO:root:layer.out*step0*t*14 INFO:root:layer.layers.6*step0*t*15 INFO:root:layer.layers.6*step0*mm*5 ``` TIPS: - 目前反向最后一步的行为存在问题,dispatch后的backward过程在`nn.module`的`full_backward_hook`之后,与预期行为不一致,导致通过module指定时无法正常识别。 - 存在一些api不从属于任何module,比如在model的forward过程中直接进行的计算。 #### code `code`可以通过指定代码文件中的行号指定故障注入的范围。这一方式可以比较方便地指定**前向过程**的某一步,反向过程的api通常都在`loss.backward()`这一行中。为空列表时,可以对所有代码注入。 ```plain \\ "code": ["/path/to/run.py[33]","./run.py[33]"] \\(win) "code": ["\\path\\to\\run.py[33]",".\\run.py[33]"] INFO:root:forward start INFO:root:Injecting to "C:\Users\Administrator\Desktop\workspace\Inject\run.py", line 33 INFO:root:layer.layers.0*step0*t*1 INFO:root:injecting fault to t*1:0 INFO:root:layer.layers.0*step0*addmm*1 INFO:root:injecting fault to addmm*1:0 INFO:root:layer.layers.1*step0*sigmoid*1 ``` #### 指定方向 设置`direction`为[`forward`, `backward`, `both`]指定注入到训练过程的前向、反向或全部过程。 ### 指定api `targets`指定注入的api类型。指定范围后,可以根据日志信息指定注入故障的api。(optional)可以以`{api}*{调用次数}:{输出index}`的形式指定更具体的位置,不特别指定则全部注入。 ```plain // "targets": ["addmm*1:0"], // "code": ["run.py[48]"] INFO:root:Injecting to "C:\Users\Administrator\Desktop\workspace\Inject\run.py", line 48 INFO:root:layer.layers.0*step0*t*1 INFO:root:layer.layers.0*step0*addmm*1 INFO:root:injecting fault to addmm*1:0 INFO:root:layer.layers.1*step0*sigmoid*1 INFO:root:layer.layers.2*step0*t*2 INFO:root:layer.layers.2*step0*addmm*2 ``` ### 指定故障类型 目前提供了4种故障类型,对api的输出进行修改。 - light:输出乘1.5 - heavy:输出乘100 - random:输出改成随机数 - delete:只保留输出的三位小数 ## TODO [ ] optimizer定位。 [x] 对输出类型的判断,对多个返回值中的特定tensor注错。 [x] accumulate grad时的计数方式。 [ ] 区分loss function(model之外的部分)的前反向。 [ ] 优化logging信息。 [ ] 验证不注错时,dispatch过程不改变输出。 [ ] 多机多卡时,指定注错机器。 [ ] 完善故障类型。 [ ] 无法多次开关dispatch。 [x] 初始化时,只挂计数hook,到达第一个注错step后再挂其他hook,开dispatch;完成最后一个step后移除。 [ ] 配置中指定的step大于训练step时的处理。 [ ] 断点继续训练时的step计数。 [ ] 模型下不属于任何child module的api指定(当前全部忽略)