{ "cells": [ { "cell_type": "code", "execution_count": null, "id": "7943b934", "metadata": {}, "outputs": [], "source": [ "%cd /home/ubuntu/Qwen-Image-Edit-Angles" ] }, { "cell_type": "code", "execution_count": null, "id": "5de64216", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "from matplotlib import pyplot as plt" ] }, { "cell_type": "code", "execution_count": null, "id": "07aff18c", "metadata": {}, "outputs": [], "source": [ "from qwenimage.experiment import ExperimentConfig\n", "from qwenimage.experiments.experiments_qwen import ExperimentRegistry\n", "\n", "\n", "# experiment_names = ExperimentRegistry.keys()\n", "experiment_names = [\n", "\n", " \"qwen_base\",\n", " \"qwen_fa3\",\n", " \"qwen_aot\",\n", " \"qwen_fuse_aot\",\n", " \"qwen_fa3_aot\",\n", "\n", " \"qwen_fbcache_052\",\n", " \"qwen_fbcache_053\",\n", " \"qwen_fbcache_054\",\n", " \"qwen_fbcache_055\",\n", "\n", " \"qwen_fa3_aot_fp8\",\n", " \"qwen_fa3_aot_fp8_fuse\",\n", "\n", " \"qwen_base_3step\",\n", " \"qwen_base_2step\",\n", " \"qwen_fa3_aot_int8_fuse_3step\",\n", " \"qwen_fa3_aot_int8_fuse_2step\",\n", "\n", " \"qwen_lightning_lora\",\n", " \"qwen_lightning_lora_2step\",\n", " \"qwen_lightning_lora_3step\",\n", " \"qwen_lightning_fa3_aot_int8_fuse_3step\",\n", " \"qwen_lightning_fa3_aot_int8_fuse_2step\",\n", " \"qwen_lightning_fa3_aot_fp8_fuse\",\n", "\n", "]\n", "\n", "report_dir = ExperimentConfig().report_dir\n", "\n", "all_results = []\n", "for name in experiment_names:\n", " csv_path = report_dir / f\"{name}.csv\"\n", " \n", " df = pd.read_csv(csv_path, index_col=0)\n", " df['experiment'] = name\n", " all_results.append(df)\n", " print(f\"Loaded results for {name}: {len(df)} rows\")\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "53cb7629", "metadata": {}, "outputs": [], "source": [ "all_results[0]" ] }, { "cell_type": "code", "execution_count": null, "id": "5bb86726", "metadata": {}, "outputs": [], "source": [ "combined_df = pd.concat(all_results, ignore_index=True)\n", "print(f\"{combined_df.shape=}\")\n", "print(f\"{combined_df.columns.tolist()=}\")\n", "combined_df.head(5)" ] }, { "cell_type": "code", "execution_count": null, "id": "5fcd8c1a", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "fac9587f", "metadata": {}, "outputs": [], "source": [ "# profile_targets = [\"loop\", \"run_once\"]\n", "profile_targets = {\n", " \"loop\": \"equal\",\n", " \"run_once\": \"contain\"\n", "}\n", "\n", "for target, match_strategy in profile_targets.items():\n", " if match_strategy == \"equal\":\n", " plot_data = combined_df[combined_df['name'] == target].copy()\n", " elif match_strategy == \"contain\":\n", " plot_data = combined_df[combined_df['name'].str.contains(target, case=False, na=False)].copy()\n", " else:\n", " raise ValueError()\n", " plot_data = plot_data.sort_values('mean', ascending=False)\n", "\n", " fig, ax = plt.subplots(figsize=(12, 6))\n", " x_pos = range(len(plot_data))\n", " max_time = plot_data['mean'].max()\n", "\n", " bars = ax.bar(x_pos, plot_data['mean'], yerr=plot_data['std'], \n", " capsize=12, alpha=0.7, edgecolor='black')\n", " ax.set_xlabel('Optimization Type', fontsize=12, fontweight='bold')\n", " ax.set_ylabel('Time (s)', fontsize=12, fontweight='bold')\n", " ax.set_title(f'Optimizations Comparison Over: {target}', \n", " fontsize=14, fontweight='bold')\n", " ax.set_xticks(x_pos)\n", " ax.set_xticklabels([row['experiment'] for _, row in plot_data.iterrows()], \n", " rotation=45, ha='right', fontsize=12)\n", " ax.grid(axis='y', alpha=0.3)\n", "\n", "\n", " for i, (idx, row) in enumerate(plot_data.iterrows()): \n", " ax.text(i - 0.2, row['mean'] + 0.01, f\"{row['mean']:.3f}s\", \n", " ha='center', va='bottom', fontsize=12)\n", " \n", " pct_decrease = ((max_time - row['mean']) / max_time) * 100\n", " ax.text(i + 0.2, row['mean'] + 0.01, f\"(-{pct_decrease:.1f}%)\", \n", " ha='center', va='bottom', fontsize=12, color='green')\n", " \n", " \n", "\n", " plt.tight_layout()\n", "\n", " plot_path = report_dir / f'{target}_performance_comparison.png'\n", " plt.savefig(plot_path, dpi=300, bbox_inches='tight')\n", "\n", " plt.show()\n" ] }, { "cell_type": "code", "execution_count": null, "id": "eec1ec7e", "metadata": {}, "outputs": [], "source": [ "stack_targets = [\"Preprocessing\", \"Encode Prompt\", \"Prep gen\", \"loop\", \"pre decode\", \"vae.decode\", \"post process\", \"offload\"]\n", "\n", "\n", "stack_data = combined_df[combined_df['name'].isin(stack_targets)].copy()\n", "pivot_data = stack_data.pivot(index='experiment', columns='name', values='mean')\n", "pivot_data = pivot_data[stack_targets]\n", "pivot_data['total'] = pivot_data.sum(axis=1)\n", "pivot_data = pivot_data.sort_values('total', ascending=False)\n", "pivot_data = pivot_data.drop('total', axis=1)\n", "\n", "\n", "fig, ax = plt.subplots(figsize=(14, 7))\n", "pivot_data.plot(kind='bar', stacked=True, ax=ax, \n", " colormap='viridis', edgecolor='black', capsize=12, alpha=0.7, width=0.8)\n", "\n", "\n", "ax.set_xlabel('Optimization Type', fontsize=12, fontweight='bold')\n", "ax.set_ylabel('Time (s)', fontsize=12, fontweight='bold')\n", "ax.set_title('Pipeline Time Breakdown by Optimization', \n", " fontsize=14, fontweight='bold')\n", "ax.set_xticklabels(pivot_data.index, rotation=45, ha='right', fontsize=12)\n", "ax.legend(title='Pipeline Stage', bbox_to_anchor=(1.05, 1), loc='upper left', fontsize=10)\n", "ax.grid(axis='y', alpha=0.3)\n", "\n", "max_time = pivot_data.sum(axis=1).max()\n", "for i, (idx, row) in enumerate(pivot_data.iterrows()):\n", " total = row.sum()\n", " \n", " ax.text(i - 0.2, total + 0.01, f'{total:.3f}s', \n", " ha='center', va='bottom', fontsize=12, fontweight='bold')\n", " \n", " pct_decrease = ((max_time - total) / max_time) * 100\n", " ax.text(i + 0.2, total + 0.01, f'(-{pct_decrease:.1f}%)', \n", " ha='center', va='bottom', fontsize=12, color='green', fontweight='bold')\n", "\n", "plt.tight_layout()\n", "\n", "plot_path = report_dir / 'stacked_time_breakdown.png'\n", "plt.savefig(plot_path, dpi=300, bbox_inches='tight')\n", "\n", "plt.show()\n" ] }, { "cell_type": "code", "execution_count": null, "id": "db8bf253", "metadata": {}, "outputs": [], "source": [ "stack_data" ] }, { "cell_type": "code", "execution_count": null, "id": "fd23a11b", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "b386ec5e", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "3c2c15ce", "metadata": {}, "outputs": [], "source": [] } ], "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.10.12" } }, "nbformat": 4, "nbformat_minor": 5 }