dist-ir/notebooks/mlsys22_results.ipynb

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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
"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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
"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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
"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
}