|
| 1 | +# 7-3 推理框架的辅助增值功能 |
| 2 | +> 不属于框架的核心功能,但让用户用起来比较舒服的一些东西 |
| 3 | +> |
| 4 | +> 这里还是用 Triton 举例,妥妥的业界标杆 |
| 5 | +
|
| 6 | +## 7-3-1 Model Analyzer |
| 7 | +[Model Analyzer](https://github.com/triton-inference-server/model_analyzer)是一个 CLI 工具,可以帮助模型训练者在给定的硬件上找到最优的模型配置,并且可以生成报告,帮助你了解不同参数设置,或者其他的 trade-off 操作下,模型的性能变化。 |
| 8 | + |
| 9 | +首先,对于 Triton-inference-server 支持的模型类型,model_analyzer 也都是支持的,如下所示: |
| 10 | +1. Single/Multi-Model |
| 11 | +2. Ensemble |
| 12 | +3. BLS |
| 13 | +4. LLM(大语言模型) |
| 14 | + |
| 15 | +此外,model_analyzer 通过参数搜索完成最优模型配置的寻找,对于参数的搜索,model analyzer 集成了几种 Search Modes,帮助我们简化调参过程 |
| 16 | +> 参考链接:https://github.com/triton-inference-server/model_analyzer/blob/main/docs/config_search.md |
| 17 | +
|
| 18 | +1. Default Search Mode:对于不同模型类型,其 Default Search Mode 是不同的,例如 single 模型而言,其 default search mode 是 Brute Force Search,但是对于 Multi-model 而言,其 Default search mode是 Quick Search |
| 19 | +2. Optuna Seach:使用一些超参数优化框架进行启发式扫描,来查找最佳配置 |
| 20 | +3. Quick Search:快速搜索,运用一些启发式的算法,稀疏的对参数进行搜索 |
| 21 | +4. Automatic Brute Search:自动暴力搜索 |
| 22 | +5. Manual Brute Search:手动暴力搜索,手动扫描模型配置中指定的参数 |
| 23 | + |
| 24 | +## 7-3-2 Model Navigator |
| 25 | +[Model Navigator](https://github.com/triton-inference-server/model_navigator)是一个推理工具包,简化了模型的移动工作,并且提供了很多 [pipeline示例](https://github.com/triton-inference-server/model_navigator/tree/main/examples) |
| 26 | + |
| 27 | +它可以自动执行几个关键步骤,包含模型导出、转换,性能测试和分析,并且可以将生成的优化模型轻松的部署到 Triton Inference Server上,下面简单介绍一下它的 Features |
| 28 | + |
| 29 | +- Model Export and Conversion:自动执行各种格式之间的模型导出和转换过程 |
| 30 | +- Correctness Testing:正确性测试,确保转换后的模型笨狗产生正确的输出,并进行验证 |
| 31 | +- Models Depolyment:通过专用的 API 在 PyTrition 和 Triton Inference Server 上自动部署模型或 Pipelines |
| 32 | +- Pipelines Optimazation:管道功能,优化了像 Stable Diffusion 和 Whisper 这样的 Pytorch 模型的代码流程 |
| 33 | + ```python |
| 34 | + import model_navigator as nav |
| 35 | + from transformers.modeling_outputs import BaseModelOutputWithPooling |
| 36 | + from diffusers import DPMSolverMultistepScheduler, StableDiffusionPipeline |
| 37 | + |
| 38 | + |
| 39 | + def get_pipeline(): |
| 40 | + # Initialize Stable Diffusion pipeline and wrap modules for optimization |
| 41 | + pipe = StableDiffusionPipeline.from_pretrained("stabilityai/stable-diffusion-2-1") |
| 42 | + pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config) |
| 43 | + pipe = pipe.to("cuda") |
| 44 | + pipe.text_encoder = nav.Module( |
| 45 | + pipe.text_encoder, |
| 46 | + name="clip", |
| 47 | + output_mapping=lambda output: BaseModelOutputWithPooling(**output), |
| 48 | + ) |
| 49 | + pipe.unet = nav.Module( |
| 50 | + pipe.unet, |
| 51 | + name="unet", |
| 52 | + ) |
| 53 | + pipe.vae.decoder = nav.Module( |
| 54 | + pipe.vae.decoder, |
| 55 | + name="vae", |
| 56 | + ) |
| 57 | + return pipe |
| 58 | + ``` |
| 59 | + 使用 nav.Module包裹模型组件,就可以在数据上完成端到端的优化。例如下面我们准备一个简单的数据加载器: |
| 60 | + ```python |
| 61 | + def get_dataloader(): |
| 62 | + # 第一个元素是 batch size |
| 63 | + return [(1, "a photo of an astronaut riding a horse on mars")] |
| 64 | + ``` |
| 65 | + 接着,我们执行模型优化并显式的加载最高性能版本 |
| 66 | + ```python |
| 67 | + pipe = get_pipeline() |
| 68 | + dataloader = get_dataloader() |
| 69 | + nav.optimize(pipe, dataloader) |
| 70 | + nav.load |
| 71 | + ``` |
| 72 | + 同样的,也可以使用 pipeline 直接进行优化模型的推理 |
| 73 | + ```python |
| 74 | + pipe.to("cuda") |
| 75 | + images = pipe(["a photo of an astronaut riding a horse on mars"]) |
| 76 | + image = images[0][0] |
| 77 | + image.save("an_astronaut_riding_a_horse.png") |
| 78 | + ``` |
| 79 | + |
| 80 | + |
| 81 | + |
| 82 | + |
| 83 | + |
0 commit comments