622 строки
100 KiB
Plaintext
622 строки
100 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"id": "supreme-skirt",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import numpy as np\n",
|
|
"import os\n",
|
|
"import pandas as pd\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"import pylab"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"id": "racial-savage",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"plt.rcParams[\"font.size\"] = 18\n",
|
|
"plt.rcParams[\"font.family\"] = \"Times New Roman\""
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"id": "romance-wichita",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"FIGURES_DIR = \"figures/mlsys22\""
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "structural-newman",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Simulator accuracy"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"id": "civic-auditor",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def get_parallelism_style(dp, hp, pp):\n",
|
|
" if dp == 1 and hp == 1 and pp == 1:\n",
|
|
" return \"Base\"\n",
|
|
" elif dp > 1 and hp == 1 and pp == 1:\n",
|
|
" return \"D\"\n",
|
|
" elif dp == 1 and hp > 1 and pp == 1:\n",
|
|
" return \"T\"\n",
|
|
" elif dp == 1 and hp == 1 and pp > 1:\n",
|
|
" return \"P\"\n",
|
|
" elif dp > 1 and hp > 1 and pp == 1:\n",
|
|
" return \"D/T\"\n",
|
|
" elif dp == 1 and hp > 1 and pp > 1:\n",
|
|
" return \"T/P\"\n",
|
|
" elif dp > 1 and hp == 1 and pp > 1:\n",
|
|
" return \"D/P\"\n",
|
|
" elif dp > 1 and hp > 1 and pp > 1:\n",
|
|
" return \"D/T/P\"\n",
|
|
" else:\n",
|
|
" raise ValueError(f\"Invalid degree combination dp={dp}, hp={hp}, pp={pp}\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"id": "prerequisite-exchange",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def plot_simulator_accuracy(\n",
|
|
" pytorch_filename,\n",
|
|
" simulation_filename,\n",
|
|
" x,\n",
|
|
" y,\n",
|
|
" xlabel,\n",
|
|
" ylabel,\n",
|
|
" xstep,\n",
|
|
" ystep,\n",
|
|
" output_filename,\n",
|
|
" legend_output_filename=None,\n",
|
|
"):\n",
|
|
" df = pd.read_csv(pytorch_filename)\n",
|
|
" df_simulation = pd.read_csv(simulation_filename)\n",
|
|
" df = df.rename(\n",
|
|
" columns={\"latency\": \"pytorch_latency\", \"throughput\": \"pytorch_throughput\"}\n",
|
|
" )\n",
|
|
" df[\"simulated_latency\"] = df_simulation[\"latency\"]\n",
|
|
" df[\"simulated_throughput\"] = df_simulation[\"throughput\"]\n",
|
|
" parallelism_styles = [\n",
|
|
" get_parallelism_style(dp, hp, pp)\n",
|
|
" for (dp, hp, pp) in df[[\"dp_degree\", \"hp_degree\", \"pp_degree\"]].values\n",
|
|
" ]\n",
|
|
" df[\"parallelism_style\"] = parallelism_styles\n",
|
|
" markers = [\"o\", \"P\", \"^\", \"*\", \"X\", \"D\", \"H\", \"s\"]\n",
|
|
" colors = [\n",
|
|
" \"#7f7f7f\", # middle gray\n",
|
|
" \"#1f77b4\", # muted blue\n",
|
|
" \"#ff7f0e\", # safety orange\n",
|
|
" \"#2ca02c\", # cooked asparagus green\n",
|
|
" \"#d62728\", # brick red\n",
|
|
" \"#9467bd\", # muted purple\n",
|
|
" \"#8c564b\", # chestnut brown\n",
|
|
" \"#e377c2\", # raspberry yogurt pink\n",
|
|
" # \"#bcbd22\", # curry yellow-green\n",
|
|
" # \"#17becf\", # blue-teal\n",
|
|
" ]\n",
|
|
" parallelism_styles = [\n",
|
|
" \"Base\",\n",
|
|
" \"D\",\n",
|
|
" \"T\",\n",
|
|
" \"P\",\n",
|
|
" \"D/T\",\n",
|
|
" \"T/P\",\n",
|
|
" \"D/P\",\n",
|
|
" \"D/T/P\",\n",
|
|
" ]\n",
|
|
" lines = []\n",
|
|
" fig = pylab.figure(figsize=(5, 5))\n",
|
|
" ax = fig.add_subplot(111)\n",
|
|
" figlegend = pylab.figure(figsize=(5, 1))\n",
|
|
" for (parallelism_style, marker, color) in zip(parallelism_styles, markers, colors):\n",
|
|
" lines.append(\n",
|
|
" ax.scatter(\n",
|
|
" df[df[\"parallelism_style\"] == parallelism_style][x],\n",
|
|
" df[df[\"parallelism_style\"] == parallelism_style][y],\n",
|
|
" label=parallelism_style,\n",
|
|
" marker=marker,\n",
|
|
" color=color,\n",
|
|
" s=100,\n",
|
|
" zorder=3\n",
|
|
" )\n",
|
|
" )\n",
|
|
" min_val = min(min(df[x]), min(df[y]))\n",
|
|
" max_val = max(max(df[x]), max(df[y]))\n",
|
|
" ax.plot(\n",
|
|
" [min_val, max_val],\n",
|
|
" [min_val, max_val],\n",
|
|
" linestyle=\"--\",\n",
|
|
" color=\"black\",\n",
|
|
" zorder=2,\n",
|
|
" )\n",
|
|
" # ax.set_yticks(np.arange(0, max(df[y]) + ystep, ystep))\n",
|
|
" xticks = np.arange(0, max(df[x]) + xstep, xstep)\n",
|
|
" yticks = np.arange(0, max(df[x]) + ystep, ystep)\n",
|
|
" ax.set_xticks(xticks)\n",
|
|
" ax.set_xticklabels([str(int(t)) for t in xticks])\n",
|
|
" ax.set_yticks(yticks)\n",
|
|
" ax.set_yticklabels([str(int(t)) for t in yticks])\n",
|
|
" ax.set_xlabel(xlabel)\n",
|
|
" ax.set_ylabel(ylabel)\n",
|
|
" ax.grid(zorder=0)\n",
|
|
" leg = figlegend.legend(\n",
|
|
" lines,\n",
|
|
" parallelism_styles,\n",
|
|
" frameon=False,\n",
|
|
" loc=\"center\",\n",
|
|
" ncol=4,\n",
|
|
" columnspacing=None,\n",
|
|
" labelspacing=None,\n",
|
|
" )\n",
|
|
" fig.savefig(output_filename, bbox_inches=\"tight\")\n",
|
|
" if legend_output_filename is not None:\n",
|
|
" figlegend.savefig(legend_output_filename, bbox_inches=\"tight\")\n",
|
|
" # Get the bounding box of the original legend.\n",
|
|
"\n",
|
|
"\n",
|
|
"# bb = leg.get_bbox_to_anchor().transformed(plt.gca().transAxes.inverted())\n",
|
|
"\n",
|
|
"# # Change to location of the legend.\n",
|
|
"# yOffset = 1.2\n",
|
|
"# bb.y0 += yOffset\n",
|
|
"# bb.y1 += yOffset\n",
|
|
"# leg.set_bbox_to_anchor(bb, transform=plt.gca().transAxes)\n",
|
|
"# leg.get_frame().set_linewidth(0.0)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "empirical-registrar",
|
|
"metadata": {},
|
|
"source": [
|
|
"### MLP Training"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"id": "voluntary-refund",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 360x360 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"<Figure size 360x72 with 0 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"simulation_filename = \"~/Downloads/mlp_grid_search_results_simulation_v100.csv\"\n",
|
|
"pytorch_filename = \"~/Downloads/mlp_grid_search_results_pytorch_v100.csv\"\n",
|
|
"plot_simulator_accuracy(\n",
|
|
" pytorch_filename,\n",
|
|
" simulation_filename,\n",
|
|
" \"pytorch_throughput\",\n",
|
|
" \"simulated_throughput\",\n",
|
|
" \"PyTorch throughput\\n(samples / second)\",\n",
|
|
" \"Simulated throughput\\n(samples /second)\",\n",
|
|
" 5000,\n",
|
|
" 2500,\n",
|
|
" os.path.join(FIGURES_DIR, \"mlp_training_pytorch_vs_simulated_throughput.pdf\"),\n",
|
|
" os.path.join(FIGURES_DIR, \"pytorch_vs_simulated_throughput_legend.pdf\"),\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "advanced-woman",
|
|
"metadata": {},
|
|
"source": [
|
|
"### GPT-2 Inference"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "reflected-cause",
|
|
"metadata": {},
|
|
"source": [
|
|
"### TODO"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "american-petroleum",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Optimal configurations"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"id": "magnetic-playback",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def plot_optimal_configurations(\n",
|
|
" pytorch_filename,\n",
|
|
" all_model_sizes,\n",
|
|
" metric,\n",
|
|
" output_filename,\n",
|
|
" legend_output_filename=None,\n",
|
|
"):\n",
|
|
" def get_data(model_size):\n",
|
|
" if metric == \"throughput\":\n",
|
|
" sort_fn = max\n",
|
|
" elif metric == \"latency\":\n",
|
|
" sort_fn = min\n",
|
|
" df = pd.read_csv(pytorch_filename)\n",
|
|
" # df = df[df[\"model_size\"] == model_size]\n",
|
|
" df = df[\n",
|
|
" df[\"model_size\"] == all_model_sizes[0]\n",
|
|
" ] # TODO: Fix this, only for demonstration purposes\n",
|
|
" df = df.sort_values(by=[\"throughput\"], ascending=False)\n",
|
|
" data = [\n",
|
|
" sort_fn(\n",
|
|
" df[\n",
|
|
" (df[\"dp_degree\"] == 1)\n",
|
|
" & (df[\"hp_degree\"] == 1)\n",
|
|
" & (df[\"pp_degree\"] == 1)\n",
|
|
" ][metric].values\n",
|
|
" ),\n",
|
|
" sort_fn(\n",
|
|
" df[\n",
|
|
" (df[\"dp_degree\"] > 1)\n",
|
|
" & (df[\"hp_degree\"] == 1)\n",
|
|
" & (df[\"pp_degree\"] == 1)\n",
|
|
" ][metric].values\n",
|
|
" ),\n",
|
|
" sort_fn(\n",
|
|
" df[\n",
|
|
" (df[\"dp_degree\"] == 1)\n",
|
|
" & (df[\"hp_degree\"] > 1)\n",
|
|
" & (df[\"pp_degree\"] == 1)\n",
|
|
" ][metric].values\n",
|
|
" ),\n",
|
|
" sort_fn(\n",
|
|
" df[\n",
|
|
" (df[\"dp_degree\"] == 1)\n",
|
|
" & (df[\"hp_degree\"] == 1)\n",
|
|
" & (df[\"pp_degree\"] > 1)\n",
|
|
" ][metric].values\n",
|
|
" ),\n",
|
|
" sort_fn(\n",
|
|
" df[\n",
|
|
" ((df[\"dp_degree\"] > 1) & (df[\"hp_degree\"] > 1))\n",
|
|
" | ((df[\"dp_degree\"] > 1) & (df[\"pp_degree\"] > 1))\n",
|
|
" | ((df[\"hp_degree\"] > 1) & (df[\"pp_degree\"] > 1))\n",
|
|
" ][metric].values\n",
|
|
" ),\n",
|
|
" ]\n",
|
|
" base = data[0]\n",
|
|
" if metric == \"throughput\":\n",
|
|
" data = [v / base for v in data[1:]]\n",
|
|
" elif metric == \"latency\":\n",
|
|
" data = [base / v for v in data[1:]]\n",
|
|
" return data\n",
|
|
"\n",
|
|
" fig = pylab.figure(figsize=(5, 5))\n",
|
|
" ax = fig.add_subplot(111)\n",
|
|
" figlegend = pylab.figure(figsize=(5, 1))\n",
|
|
" width = 0.65 / len(all_model_sizes)\n",
|
|
" if len(all_model_sizes) > 1:\n",
|
|
" offsets = np.arange(\n",
|
|
" -1 * width, 4 * width, width\n",
|
|
" ) # TODO: Fix for even number of model sizes\n",
|
|
" else:\n",
|
|
" offsets = [0]\n",
|
|
" patterns = [\"/\", \"x\", \"+\"]\n",
|
|
" lines = []\n",
|
|
" max_val = -1\n",
|
|
" for i, model_size in enumerate(all_model_sizes):\n",
|
|
" data = get_data(model_size)\n",
|
|
" x = np.array(list(range(len(data)))) + offsets[i]\n",
|
|
" if i == 0:\n",
|
|
" lines.append(\n",
|
|
" ax.bar(x, height=data, width=width, label=model_size, zorder=3)\n",
|
|
" )\n",
|
|
" else:\n",
|
|
" lines.append(\n",
|
|
" ax.bar(\n",
|
|
" x,\n",
|
|
" height=data,\n",
|
|
" width=width,\n",
|
|
" label=model_size,\n",
|
|
" hatch=patterns[i - 1],\n",
|
|
" zorder=3,\n",
|
|
" )\n",
|
|
" )\n",
|
|
" max_val = max(max(data), max_val)\n",
|
|
" # for j in range(len(data)):\n",
|
|
" # plt.text(j+offsets[i], data[j] + 0.05 * data[0], f\"{data[j]:.2f}.x\", ha=\"center\")\n",
|
|
" ax.set_xticks(ticks=np.array(list(range(len(data)))))\n",
|
|
" ax.set_xticklabels([\"D\", \"T\", \"P\", \"Hybrid\"])\n",
|
|
" ax.set_xlabel(\"Configuration\")\n",
|
|
" ax.set_ylabel(\"Speedup\")\n",
|
|
" ax.set_ylim(0, 1.2 * max_val)\n",
|
|
" spines = list(ax.spines.keys())\n",
|
|
" ax.spines[spines[1]].set_visible(False)\n",
|
|
" ax.spines[spines[3]].set_visible(False)\n",
|
|
" leg = figlegend.legend(\n",
|
|
" lines,\n",
|
|
" all_model_sizes,\n",
|
|
" frameon=False,\n",
|
|
" loc=\"center\",\n",
|
|
" ncol=4,\n",
|
|
" columnspacing=None,\n",
|
|
" labelspacing=None,\n",
|
|
" )\n",
|
|
" ax.grid(zorder=0)\n",
|
|
" fig.savefig(output_filename, bbox_inches=\"tight\")\n",
|
|
" if legend_output_filename is not None:\n",
|
|
" figlegend.savefig(legend_output_filename, bbox_inches=\"tight\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "coordinated-thesis",
|
|
"metadata": {},
|
|
"source": [
|
|
"### MLP Training"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"id": "collect-input",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 360x360 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"<Figure size 360x72 with 0 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"pytorch_filename = \"~/Downloads/mlp_grid_search_results_pytorch_v100.csv\"\n",
|
|
"plot_optimal_configurations(\n",
|
|
" pytorch_filename,\n",
|
|
" [\"mlp-xs\", \"mlp-small\", \"mlp-medium\"],\n",
|
|
" \"throughput\",\n",
|
|
" os.path.join(FIGURES_DIR, \"mlp_training_optimal_configurations.pdf\"),\n",
|
|
" os.path.join(FIGURES_DIR, \"mlp_training_optimal_configurations_legend.pdf\"),\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "white-watts",
|
|
"metadata": {},
|
|
"source": [
|
|
"### GPT-2 Inference"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "intended-piece",
|
|
"metadata": {},
|
|
"source": [
|
|
"### TODO"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "silver-tradition",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Memory usage vs throughput / latency"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 11,
|
|
"id": "senior-hobby",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def plot_memory_usage_vs_metric(\n",
|
|
" simulation_filename, metric, xlabel, ylabel, output_filename, legend_output_filename=None\n",
|
|
"):\n",
|
|
" df = pd.read_csv(simulation_filename)\n",
|
|
" parallelism_styles = [\n",
|
|
" get_parallelism_style(dp, hp, pp)\n",
|
|
" for (dp, hp, pp) in df[[\"dp_degree\", \"hp_degree\", \"pp_degree\"]].values\n",
|
|
" ]\n",
|
|
" df[\"parallelism_style\"] = parallelism_styles\n",
|
|
" markers = [\"o\", \"P\", \"^\", \"*\", \"X\", \"D\", \"H\", \"s\"]\n",
|
|
" colors = [\n",
|
|
" \"#7f7f7f\", # middle gray\n",
|
|
" \"#1f77b4\", # muted blue\n",
|
|
" \"#ff7f0e\", # safety orange\n",
|
|
" \"#2ca02c\", # cooked asparagus green\n",
|
|
" \"#d62728\", # brick red\n",
|
|
" \"#9467bd\", # muted purple\n",
|
|
" \"#8c564b\", # chestnut brown\n",
|
|
" \"#e377c2\", # raspberry yogurt pink\n",
|
|
" # \"#bcbd22\", # curry yellow-green\n",
|
|
" # \"#17becf\", # blue-teal\n",
|
|
" ]\n",
|
|
" parallelism_styles = [\n",
|
|
" \"Base\",\n",
|
|
" \"D\",\n",
|
|
" \"T\",\n",
|
|
" \"P\",\n",
|
|
" \"D/T\",\n",
|
|
" \"T/P\",\n",
|
|
" \"D/P\",\n",
|
|
" \"D/T/P\",\n",
|
|
" ]\n",
|
|
" lines = []\n",
|
|
" fig = pylab.figure(figsize=(8, 5))\n",
|
|
" ax = fig.add_subplot(111)\n",
|
|
" figlegend = pylab.figure(figsize=(5, 1))\n",
|
|
" for (parallelism_style, marker, color) in zip(parallelism_styles, markers, colors):\n",
|
|
" lines.append(\n",
|
|
" ax.scatter(\n",
|
|
" df[df[\"parallelism_style\"] == parallelism_style][metric],\n",
|
|
" df[df[\"parallelism_style\"] == parallelism_style][\"peak_memory\"] / 1e9,\n",
|
|
" label=parallelism_style,\n",
|
|
" marker=marker,\n",
|
|
" color=color,\n",
|
|
" s=200,\n",
|
|
" zorder=3,\n",
|
|
" )\n",
|
|
" )\n",
|
|
" ax.grid(zorder=0)\n",
|
|
" ax.set_xlabel(xlabel)\n",
|
|
" ax.set_ylabel(ylabel)\n",
|
|
" fig.tight_layout()\n",
|
|
" fig.savefig(output_filename, bbox_inches=\"tight\")\n",
|
|
" leg = figlegend.legend(\n",
|
|
" lines,\n",
|
|
" parallelism_styles,\n",
|
|
" frameon=False,\n",
|
|
" loc=\"center\",\n",
|
|
" ncol=8,\n",
|
|
" columnspacing=None,\n",
|
|
" labelspacing=None,\n",
|
|
" )\n",
|
|
" if legend_output_filename is not None:\n",
|
|
" figlegend.savefig(legend_output_filename, bbox_inches=\"tight\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "buried-tomorrow",
|
|
"metadata": {},
|
|
"source": [
|
|
"### MLP Training"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"id": "steady-devil",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 576x360 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"<Figure size 360x72 with 0 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"simulation_filename = \"~/Downloads/mlp_grid_search_results_simulation_v100.csv\"\n",
|
|
"plot_memory_usage_vs_metric(\n",
|
|
" simulation_filename,\n",
|
|
" \"throughput\",\n",
|
|
" \"Throughput (samples / second)\",\n",
|
|
" \"Peak Memory (GB)\",\n",
|
|
" os.path.join(FIGURES_DIR, \"mlp_training_memory_vs_throughput.pdf\"),\n",
|
|
" os.path.join(FIGURES_DIR, \"mlp_training_memory_vs_throughput_legend.pdf\"),\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "compact-motorcycle",
|
|
"metadata": {},
|
|
"source": [
|
|
"### GPT-2 Inference"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "electronic-transition",
|
|
"metadata": {},
|
|
"source": [
|
|
"### TODO"
|
|
]
|
|
}
|
|
],
|
|
"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",
|
|
"version": "3.9.2"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|