1-Model_Optimization.ipynb 138.5 KB
Notebook
Newer Older
D
dyonghan 已提交
1 2 3 4 5 6 7 8 9 10
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h1 style=\"text-align:center\">调优模型和训练策略</h1>\n",
    "\n",
    "## 作业介绍\n",
    "\n",
11
    "模型调优和训练策略调优是当前深度学习领域最常见、最难和最耗费精力的工作,旨在降低训练难度,提高模型精度,减少模型大小,降低模型推理时延。本作业要求在给定LeNet5模型+CIFAR-10数据集的基础上,对模型和训练策略进行调优,以验证精度、模型大小和推理时延为目标,优先级为精度>大小>时延。\n",
D
dyonghan 已提交
12
    "\n",
13
    "要求模型在CIFAR-10验证集上的精度不低于65%,最终成绩可参考`0.50*精度(%) - 0.35*大小(MB) - 0.15*时延(ms)`的方式评定。\n",
D
dyonghan 已提交
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
    "\n",
    "## 作业目的\n",
    "\n",
    "- 了解当前深度学习研发人员最常见的工作;\n",
    "- 了解并熟悉如何使用MindSpore进行模型开发和调试;\n",
    "- 了解模型调优的基本方向和常用策略,了解模型深度(层数)、模型宽度(核大小)、特殊结构(Bypass)等概念,及其对模型精度、大小和时延的影响;\n",
    "- 了解训练策略调优的常用方法,了解Epoch数、Batch Size、优化器、学习率、正则化项等对模型训练和精度的影响。\n",
    "\n",
    "## 预备知识\n",
    "\n",
    "- 熟练使用Python,了解Shell及Linux操作系统基本知识。\n",
    "- 具备一定的深度学习理论知识,如卷积神经网络、损失函数、优化器,训练策略、Checkpoint等。\n",
    "- 了解华为云的基本使用方法,包括[OBS(对象存储)](https://www.huaweicloud.com/product/obs.html)、[ModelArts(AI开发平台)](https://www.huaweicloud.com/product/modelarts.html)、[Notebook(开发工具)](https://support.huaweicloud.com/engineers-modelarts/modelarts_23_0033.html)等功能。华为云官网:https://www.huaweicloud.com\n",
    "- 了解并熟悉MindSpore AI计算框架,MindSpore官网:https://www.mindspore.cn/\n",
    "\n",
    "## 开发环境\n",
    "\n",
    "- MindSpore 0.1.0(MindSpore版本会定期更新,本指导也会定期刷新,与版本配套);\n",
32
    "- 华为云ModelArts:ModelArts是华为云提供的面向开发者的一站式AI开发平台,集成了昇腾AI处理器资源池,用户可以在该平台下体验MindSpore。\n",
D
dyonghan 已提交
33 34 35 36 37 38 39
    "\n",
    "## 开发准备\n",
    "\n",
    "### 创建OBS桶\n",
    "\n",
    "本实验需要使用华为云OBS存储脚本和数据集,可以参考[快速通过OBS控制台上传下载文件](https://support.huaweicloud.com/qs-obs/obs_qs_0001.html)了解使用OBS创建桶、上传文件、下载文件的使用方法。\n",
    "\n",
40
    "> **提示:** 华为云新用户使用OBS时通常需要创建和配置“访问密钥”,可以在使用OBS时根据提示完成创建和配置。也可以参考[获取访问密钥并完成ModelArts全局配置](https://support.huaweicloud.com/prepare-modelarts/modelarts_08_0002.html)获取并配置访问密钥。\n",
D
dyonghan 已提交
41 42 43 44 45 46 47 48 49 50 51 52 53
    "\n",
    "创建OBS桶的参考配置如下:\n",
    "\n",
    "- 区域:华北-北京四\n",
    "- 数据冗余存储策略:单AZ存储\n",
    "- 桶名称:如ms-course\n",
    "- 存储类别:标准存储\n",
    "- 桶策略:公共读\n",
    "- 归档数据直读:关闭\n",
    "- 企业项目、标签等配置:免\n",
    "\n",
    "### 数据集准备\n",
    "\n",
54
    "CIFAR-10是一个图片分类数据集,包含60000张32x32的彩色物体图片,训练集50000张,测试集10000张,共10类,每类6000张。CIFAR-10数据集的官网:[The CIFAR-10 and CIFAR-100 datasets](http://www.cs.toronto.edu/~kriz/cifar.html)。\n",
D
dyonghan 已提交
55 56 57 58 59
    "\n",
    "从CIFAR-10官网下载“CIFAR-10 binary version (suitable for C programs)”到本地并解压。\n",
    "\n",
    "### 脚本准备\n",
    "\n",
60
    "从[课程gitee仓库](https://gitee.com/mindspore/course)上下载本作业相关脚本。\n",
D
dyonghan 已提交
61 62 63 64 65 66 67
    "\n",
    "### 上传文件\n",
    "\n",
    "将脚本和数据集上传到OBS桶中,组织为如下形式:\n",
    "\n",
    "```\n",
    "project_1\n",
68
    "├── *.ipynb\n",
D
dyonghan 已提交
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
    "└── cifar10\n",
    "    ├── batches.meta.txt\n",
    "    ├── eval\n",
    "    │   └── test_batch.bin\n",
    "    └── train\n",
    "        ├── data_batch_1.bin\n",
    "        ├── data_batch_2.bin\n",
    "        ├── data_batch_3.bin\n",
    "        ├── data_batch_4.bin\n",
    "        └── data_batch_5.bin\n",
    "```\n",
    "\n",
    "### 创建并打开Notebook\n",
    "\n",
    "可以参考[创建并打开Notebook](https://support.huaweicloud.com/engineers-modelarts/modelarts_23_0034.html)来创建并打开上传的Notebook脚本。\n",
    "\n",
    "创建Notebook的参考配置:\n",
    "\n",
    "- 计费模式:按需计费\n",
    "- 名称:project_1\n",
    "- 工作环境:Python3\n",
    "- 资源池:公共资源\n",
    "- 类型:Ascend\n",
    "- 规格:单卡1*Ascend 910\n",
    "- 存储位置:对象存储服务(OBS)->选择上述新建的OBS桶中的project_1文件夹\n",
    "- 自动停止等配置:默认\n",
    "\n",
    "> **注意:**\n",
    "> - 打开Notebook前,在Jupyter Notebook文件列表页面,勾选目录里的所有文件/文件夹(脚本和数据集),并点击列表上方的“Sync OBS”按钮,使OBS桶中的所有文件同时同步到Notebook工作环境中,这样Notebook中的代码才能访问数据集。参考[使用Sync OBS功能](https://support.huaweicloud.com/engineers-modelarts/modelarts_23_0038.html)。\n",
    "> - 打开Notebook后,选择MindSpore环境作为Kernel。\n",
    "\n",
100
    "> **提示:** 上述数据集和脚本的准备工作也可以在Notebook环境中完成,在Jupyter Notebook文件列表页面,点击右上角的\"New\"->\"Terminal\",进入Notebook环境所在终端,进入`work`目录,可以使用常用的linux shell命令,如`wget, gzip, tar, mkdir, mv`等,完成数据集和脚本的下载和准备。\n",
D
dyonghan 已提交
101 102 103
    "\n",
    "## 作业内容\n",
    "\n",
104
    "作业基于上述打开的Notebook进行,进行作业前请确保完成了上述准备工作。如果Notebook资源不足,请参考实验1和实验2将本Notebook转为训练作业,进行调优和训练。\n",
D
dyonghan 已提交
105
    "\n",
106
    "> **提示:** 请从上至下阅读提示并执行代码框进行体验。代码框执行过程中左侧呈现[\\*],代码框执行完毕后左侧呈现如[1],[2]等。请等上一个代码框执行完毕后再执行下一个代码框。\n",
D
dyonghan 已提交
107 108 109 110 111 112
    "\n",
    "导入MindSpore模块和辅助模块:"
   ]
  },
  {
   "cell_type": "code",
113
   "execution_count": 1,
D
dyonghan 已提交
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "# os.environ['DEVICE_ID'] = '0'\n",
    "import time\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "import mindspore as ms\n",
    "import mindspore.context as context\n",
    "import mindspore.dataset.transforms.c_transforms as C\n",
    "import mindspore.dataset.transforms.vision.c_transforms as CV\n",
    "\n",
    "from mindspore.dataset.transforms.vision import Inter\n",
    "from mindspore import nn, Tensor\n",
    "from mindspore.train import Model\n",
    "from mindspore.train.callback import ModelCheckpoint, CheckpointConfig, LossMonitor\n",
    "from mindspore.train.serialization import load_checkpoint, load_param_into_net\n",
    "\n",
    "import logging; logging.getLogger('matplotlib.font_manager').disabled = True\n",
    "\n",
    "context.set_context(mode=context.GRAPH_MODE, device_target='Ascend')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 数据处理\n",
    "\n",
    "对其中几张图片进行可视化,可以看到图片中的物体/动物,图片的大小为32x32。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
156
      "image/png": "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\n",
D
dyonghan 已提交
157 158 159 160 161 162 163 164 165 166 167
      "text/plain": [
       "<Figure size 432x288 with 9 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
168
    "DATA_DIR_TRAIN = \"cifar10/train\" # 训练集信息\n",
169 170
    "DATA_DIR_TEST = \"cifar10/eval\" # 测试集信息\n",
    "LABELS = \"cifar10/batches.meta.txt\" # 标签信息\n",
D
dyonghan 已提交
171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
    "\n",
    "ds = ms.dataset.Cifar10Dataset(DATA_DIR_TRAIN)\n",
    "ds = ds.create_dict_iterator()\n",
    "with open(LABELS, \"r\") as f:\n",
    "    labels = [x.strip() for x in f.readlines()]\n",
    "\n",
    "for i in range(1, 10):\n",
    "    data = ds.get_next() \n",
    "    plt.subplot(3, 3, i)\n",
    "    plt.imshow(data['image'])\n",
    "    plt.title('%s' % labels[data['label']])\n",
    "    plt.xticks([])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在使用数据集训练网络前,首先需要对数据进行预处理,如下:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def create_dataset(training=True, num_epoch=1, batch_size=32, resize=(32, 32), rescale=1/255, shift=0, buffer_size=64):\n",
    "    ds = ms.dataset.Cifar10Dataset(DATA_DIR_TRAIN if training else DATA_DIR_TEST)\n",
    "    \n",
    "    # define map operations\n",
    "    if training:\n",
    "        random_crop_op = CV.RandomCrop((32,32), (4,4,4,4))\n",
    "        random_flip_op = CV.RandomHorizontalFlip()\n",
    "        ds = ds.map(input_columns=\"image\", operations=[random_crop_op, random_flip_op])\n",
    "    \n",
    "    resize_op = CV.Resize(resize)  # Bilinear as default\n",
    "    rescale_op = CV.Rescale(rescale, shift)\n",
    "    normalize_op = CV.Normalize((0.4465, 0.4822, 0.4914), (0.2010, 0.1994, 0.2023))\n",
    "    changeswap_op = CV.HWC2CHW()\n",
    "    \n",
    "    # apply map operations on images\n",
    "    ds = ds.map(input_columns=\"image\", operations=[resize_op, rescale_op, normalize_op, changeswap_op])\n",
    "    ds = ds.map(input_columns=\"label\", operations=C.TypeCast(ms.int32))\n",
    "    \n",
    "    ds = ds.shuffle(buffer_size=buffer_size)\n",
    "    ds = ds.batch(batch_size, drop_remainder=True)\n",
    "    ds = ds.repeat(num_epoch)\n",
    "    \n",
    "    return ds"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 定义模型\n",
    "\n",
    "预置模型为LeNet5:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "class MyNet(nn.Cell):\n",
    "    def __init__(self):\n",
    "        super(MyNet, self).__init__()\n",
    "        self.relu = nn.ReLU()\n",
    "        self.conv1 = nn.Conv2d(3, 6, 5, stride=1, pad_mode='valid')\n",
    "        self.conv2 = nn.Conv2d(6, 16, 5, stride=1, pad_mode='valid')\n",
    "        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)\n",
    "        self.flatten = nn.Flatten()\n",
    "        self.fc1 = nn.Dense(400, 120)\n",
    "        self.fc2 = nn.Dense(120, 84)\n",
    "        self.fc3 = nn.Dense(84, 10)\n",
    "    \n",
    "    def construct(self, input_x):\n",
    "        output = self.conv1(input_x)\n",
    "        output = self.relu(output)\n",
    "        output = self.pool(output)\n",
    "        output = self.conv2(output)\n",
    "        output = self.relu(output)\n",
    "        output = self.pool(output)\n",
    "        output = self.flatten(output)\n",
    "        # print(output.shape()) # 仅Pynative模式时可用,Graph模式时请注释掉\n",
    "        output = self.fc1(output)\n",
    "        output = self.fc2(output)\n",
    "        output = self.fc3(output)\n",
    "        \n",
    "        return output"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
271 272 273
    "### 模型调试\n",
    "\n",
    "使用Pynative模式对网络进行调试,比如使用Python原生的`print`打印网络中某一层的输出Shape:`print(output.shape())`,或者某个Tensor:`print(output)`。"
D
dyonghan 已提交
274 275 276 277
   ]
  },
  {
   "cell_type": "code",
278
   "execution_count": null,
D
dyonghan 已提交
279 280 281 282 283 284 285 286 287 288 289 290
   "metadata": {},
   "outputs": [],
   "source": [
    "context.set_context(mode=context.PYNATIVE_MODE)\n",
    "x = Tensor(np.ones([1, 3, 32, 32]), ms.float32)\n",
    "y = MyNet()(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
291
    "> **注意:** 调试完毕后,需注释掉网络定义中`construct`里的打印语句:`print(output.shape())`,并将切换为Graph模式进行模型训练。"
D
dyonghan 已提交
292 293 294 295
   ]
  },
  {
   "cell_type": "code",
296
   "execution_count": null,
D
dyonghan 已提交
297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318
   "metadata": {},
   "outputs": [],
   "source": [
    "context.set_context(mode=context.GRAPH_MODE)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 模型训练\n",
    "\n",
    "一般情况下,模型训练时采用静态学习率,如0.01。随着训练步数的增加,模型逐渐趋于收敛,对权重参数的更新幅度应该逐渐降低,以减小模型训练后期的抖动。所以,模型训练时可以采用动态下降的学习率,常见的学习率下降策略有:\n",
    "\n",
    "- polynomial decay/square decay;\n",
    "- cosine decay;\n",
    "- exponential decay;\n",
    "- stage decay."
   ]
  },
  {
   "cell_type": "code",
319
   "execution_count": 5,
D
dyonghan 已提交
320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370
   "metadata": {},
   "outputs": [],
   "source": [
    "def build_lr(total_steps, decay_type='cosine', lr_base=0.1, lr_init=0.0, warmup_steps=0):\n",
    "    \"\"\"\n",
    "    Generate learning rate array.\n",
    "\n",
    "    Args:\n",
    "        total_steps (int): Total steps to decay over.\n",
    "        decay_type (str): cosine, square\n",
    "        lr_base (float): Base learning rate. Default: 0.1.\n",
    "        lr_init (float): Initial learning rate for warmup. Default: 0.0.\n",
    "        warmup_steps (int): The number of warming up steps. Default: 5.\n",
    "\n",
    "    Returns:\n",
    "        np.array, learning rate array.\n",
    "    \"\"\"\n",
    "    lr_base, lr_init = float(lr_base), float(lr_init)\n",
    "    lr_per_step = []\n",
    "    if warmup_steps != 0:\n",
    "        inc_per_step = (lr_base - lr_init) / warmup_steps\n",
    "    else:\n",
    "        inc_per_step = 0.0\n",
    "    for i in range(int(total_steps)):\n",
    "        if i < warmup_steps:\n",
    "            lr = lr_init + inc_per_step * i\n",
    "        else:\n",
    "            if decay_type == 'square':\n",
    "                frac = 1.0 - float(i - warmup_steps) / (total_steps - warmup_steps)\n",
    "                lr = lr_base * (frac * frac)\n",
    "            elif decay_type == 'exponential':\n",
    "                pass # 尝试实现\n",
    "            elif decay_type == 'cosine':\n",
    "                lr = 0.5 * lr_base * (1 + np.cos(np.pi * i / total_steps))\n",
    "            else:\n",
    "                raise\n",
    "        lr_per_step.append(lr)\n",
    "    \n",
    "    lr_per_step = np.array(lr_per_step).astype(np.float32)\n",
    "    return lr_per_step"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "观察不同学习率下降策略的曲线:"
   ]
  },
  {
   "cell_type": "code",
371
   "execution_count": 6,
D
dyonghan 已提交
372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "steps = 3*1562\n",
    "plt.plot(range(steps), [0.1]*steps)\n",
    "plt.plot(range(steps), build_lr(steps, decay_type='square', lr_base=0.1))\n",
    "plt.plot(range(steps), build_lr(steps, decay_type='cosine', lr_base=0.1))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "采用一定的训练策略对模型进行训练,并观察最终的验证精度。这里采用Momentum优化器 + cosine decay学习率下降策略。\n",
    "\n",
    "- cosine0.1_epoch100:{'acc': 0.5056089743589743, 'loss': 1.3536554261659965}\n",
    "- square0.1_epoch100:{'acc': 0.5385616987179487, 'loss': 1.2873077663855674}\n",
    "- const0.01_epoch100:{'acc': 0.5464743589743589, 'loss': 1.3035117800419147}\n",
    "\n",
    "- cosine0.1_epoch50:{'acc': 0.43900240384615385, 'loss': 1.5275637297294078}\n",
    "- square0.1_epoch50:{'acc': 0.5453725961538461, 'loss': 1.2635320337154927}\n",
    "- const0.01_epoch50:{'acc': 0.546073717948718, 'loss': 1.2912015158396501}\n",
    "\n",
    "- cosine0.01_epoch50:{'acc': 0.6571514423076923, 'loss': 0.9970117075703083}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "os.system('rm -f *.ckpt *.ir *.meta') # 清理旧的运行文件\n",
    "LOOP_SINK = context.get_context('enable_loop_sink')\n",
    "\n",
    "def test_train(num_epoch=2, momentum=0.9, lr=0.01, decay_type='square', check_point_name=\"mynet\"):\n",
    "    ds_train = create_dataset(num_epoch=num_epoch)\n",
    "    ds_eval = create_dataset(training=False)\n",
    "    steps_per_epoch = ds_train.get_dataset_size()\n",
    "    \n",
    "    net = MyNet()\n",
    "    loss = nn.loss.SoftmaxCrossEntropyWithLogits(is_grad=False, sparse=True, reduction='mean')\n",
    "    if decay_type:\n",
    "        lr = build_lr(num_epoch*steps_per_epoch, decay_type=decay_type, lr_base=lr)\n",
    "    opt = nn.Momentum(net.trainable_params(), lr, momentum, weight_decay=0.0)\n",
    "    \n",
    "    ckpt_cfg = CheckpointConfig(save_checkpoint_steps=steps_per_epoch, keep_checkpoint_max=5)\n",
    "    ckpt_cb = ModelCheckpoint(prefix=check_point_name, config=ckpt_cfg)\n",
    "    loss_cb = LossMonitor(per_print_times=1 if LOOP_SINK else steps_per_epoch)\n",
    "    \n",
    "    model = Model(net, loss, opt, metrics={'acc', 'loss'})\n",
    "    model.train(num_epoch, ds_train, callbacks=[ckpt_cb, loss_cb], dataset_sink_mode=True)\n",
    "    metrics = model.eval(ds_eval)\n",
    "    print('Metrics:', metrics)\n",
    "\n",
    "test_train(num_epoch=50, lr=0.01, decay_type='cosine')\n",
    "print('\\n'.join(sorted([x for x in os.listdir('.') if x.startswith('mynet')])))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 模型大小\n",
    "\n",
    "统计模型参数量,包括所有可训练的权重、偏置的参数。"
   ]
  },
  {
   "cell_type": "code",
456
   "execution_count": 7,
D
dyonghan 已提交
457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[('conv1.weight', 450), ('conv2.weight', 2400), ('fc1.weight', 48000), ('fc1.bias', 120), ('fc2.weight', 10080), ('fc2.bias', 84), ('fc3.weight', 840), ('fc3.bias', 10)]\n",
      "Num params(M): 0.061984\n"
     ]
    }
   ],
   "source": [
    "params = MyNet().trainable_params()\n",
    "print([(p.name, np.prod(p.data.shape())) for p in params])\n",
    "num_params = sum([np.prod(p.data.shape()) for p in params])\n",
    "print('Num params(M):', num_params/1e6)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 推理时延\n",
    "\n",
    "模型第一次执行推理时需要编译计算图和算子,通常时延较长,通常需要先进行预热(warmup),然后再循环推理多次,取多次推理时延的平均值作为模型的推理时延。"
   ]
  },
  {
   "cell_type": "code",
486
   "execution_count": null,
D
dyonghan 已提交
487
   "metadata": {},
488
   "outputs": [],
D
dyonghan 已提交
489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523
   "source": [
    "x = Tensor(np.ones([1, 3, 32, 32]), ms.float32)\n",
    "net = MyNet()\n",
    "# 预热\n",
    "for i in range(5):\n",
    "    y = net(x)\n",
    "# 多次推理取平均值\n",
    "start = time.time()\n",
    "for i in range(100):\n",
    "    y = net(x)\n",
    "end = time.time()\n",
    "print('Latency(ms):', (end-start)/100 * 1000)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 作业结论\n",
    "\n",
    "预置训练策略,以及预置模型的精度、大小和时延如下:\n",
    "\n",
    "| batch size | number of epochs | learning rate | decay type | optimizer | number of parameters(M) | latency(ms) | acc(%) |\n",
    "| -- | -- | -- | -- | -- | -- | -- | -- |\n",
    "| 32 | 50 | 0.01 | cosine | Momentum 0.9 | 0.061984 | 1.290 | 65.7 |\n",
    "\n",
    "在预置模型和训练策略的基础上,请:\n",
    "\n",
    "- 尝试调整模型深度(层数)、模型宽度(核大小)、模型结构(Conv, MaxPool, AvgPool, FC, Bypass)等,并评估其对模型精度、大小和时延的影响;\n",
    "- 尝试调整Epoch数、Batch Size、优化器、学习率、正则化项等,并评估其对模型训练和精度的影响。\n",
    "\n",
    "调优模型和训练策略的结果(请填写):\n",
    "\n",
    "| batch size | number of epochs | learning rate | decay type | optimizer | number of parameters(M) | latency(ms) | acc(%) |\n",
    "| -- | -- | -- | -- | -- | -- | -- | -- |\n",
524
    "| 32 |  |  |  |  |  |  |  |\n",
D
dyonghan 已提交
525 526 527
    "\n",
    "### 模型调优总结\n",
    "\n",
528
    "请填写:\n",
D
dyonghan 已提交
529 530 531
    "\n",
    "### 训练策略调优总结\n",
    "\n",
532
    "请填写:\n"
D
dyonghan 已提交
533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
552
   "version": "3.7.5"
D
dyonghan 已提交
553 554 555 556
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
557
}