{ "cells": [ { "cell_type": "markdown", "metadata": { "run_control": { "frozen": false, "read_only": false } }, "source": [ "# Benchmarking GFLOPS with pywren and lambda\n" ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "ExecuteTime": { "end_time": "2017-02-27T10:34:14.685368", "start_time": "2017-02-27T10:34:14.671498" }, "collapsed": false, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] } ], "source": [ "%pylab inline\n", "import numpy as np\n", "import time\n", "import flops_benchmark\n", "import pandas as pd\n", "import cPickle as pickle\n", "import seaborn as sns\n", "sns.set_style('whitegrid')\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Getting Started \n", "\n", "We are going to benchmark the simple function below, which simply generates two matrices and computes their matrix (dot) product. The matrices are of size `MAT_N` and we will compute the product `loopcount` times. " ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2017-02-27T09:26:13.230345", "start_time": "2017-02-27T09:26:13.219630" }, "collapsed": true }, "outputs": [], "source": [ "\n", "def compute_flops(loopcount, MAT_N):\n", " \n", " A = np.arange(MAT_N**2, dtype=np.float64).reshape(MAT_N, MAT_N)\n", " B = np.arange(MAT_N**2, dtype=np.float64).reshape(MAT_N, MAT_N)\n", "\n", " t1 = time.time()\n", " for i in range(loopcount):\n", " c = np.sum(np.dot(A, B))\n", "\n", " FLOPS = 2 * MAT_N**3 * loopcount\n", " t2 = time.time()\n", " return FLOPS / (t2-t1)\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "All of the actual benchmark code is in a stand-alone python file, which you can call as follows. It places the output in `small.pickle`" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "ExecuteTime": { "end_time": "2017-02-27T10:38:59.263090", "start_time": "2017-02-27T10:38:30.640817" }, "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "('invocation done, dur=', 2.776315927505493)\n", "('callset id: ', '0c7bfb9e-a511-47db-a204-aa312584b6fd')\n", "('total time', 27.661000967025757)\n", "7.76357894843 GFLOPS\n" ] } ], "source": [ "!python flops_benchmark.py --workers=10 --loopcount=10 --matn=1024 --outfile=\"small.pickle\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can plot a histogram of the results: " ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2017-02-27T09:26:39.652451", "start_time": "2017-02-27T09:26:39.498018" }, "collapsed": false }, "outputs": [], "source": [ "exp_results = pickle.load(open(\"small.pickle\", 'r'))\n", "results_df = flops_benchmark.results_to_dataframe(exp_results)\n" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "ExecuteTime": { "end_time": "2017-02-27T10:06:58.628054", "start_time": "2017-02-27T10:06:58.314181" }, "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgkAAAF9CAYAAACOOfuyAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAHqlJREFUeJzt3X+YZFV95/F3dVem7UZHEHEG1ySSX1/HLBt+GEcWI2r+\nQBLRyEaCsolJXBXwR9BkQ0wm8kR9NIgRBX+FbMBlTYhEUTQYsypRo0DCSBIhmG92TVwMPwYQe3qc\n6Zmxumr/uNVY1pye6dtd1d3VvF/PM093nTp17uk6fac+fe659zY6nQ6SJEn9xla7A5IkaW0yJEiS\npCJDgiRJKjIkSJKkIkOCJEkqMiRIkqQiQ4IkSSoyJEiSpCJDgiRJKmrWfUFE/DDwHuBk4JvAuzPz\n7QvUPR54H3AscDtwbmbeuvTuSpKklVJrJiEiGsD1wA7gOOAcYFtEnFWoO9Wt+3ngBOAm4PqImFxu\npyVJ0vDVPdywCfh74LzM/Fpmfgr4LPD0Qt2zgD2ZeUFWzgd2AS9cVo8lSdKKqHW4ITPvBV40/zgi\nTgaeQTWj0G8r8MW+si8BJwFX1eumJElaaUteuBgRXwe+ANwIXFuocjRwd1/ZDuAJS92mJElaOcs5\nu+EM4HTgeOCdheengH19ZfuAiWVsU5IkrZDaZzfMmz9LISJeC3wwIn49M1s9VfZyYCCYAPYsdhud\nTqfTaDSW2kVpIO6//36uu+E2HvmoRw+87W/v2snzn30sRx111MDblvSwt+wP0FohISIeB5yUmdf1\nFN8BbAA2Ag/2lN8FbO5rYjNwz2K312g0mJmZZW6uXaebWoPGx8fYuHFyJMdzeno3481JNkw8cuBt\nj8/uZ3p6N83m1MDbHrZRHlMdyPFcX+bHc7nqziQcA1wbEU/IzPkP+6cA92fmg311bwYu6Cs7GXhz\nnQ3OzbVptfyFXS9GcTxbrQ7tdoe5dmfgbbfbHVqtzsi9J71GcUy1MMdTveqGhFuA7cAVEfE6qtDw\nNrof/BGxCdiZmXuBDwNvjYhLgMupzoCYAq4ZUN8lSdIQ1Vq4mJlt4PnAbqqzGi4H3pmZ7+5WuQc4\ns1t3F/BcqlMktwNPBU7LzNnBdF2SJA1T7YWL3Wsl/PwCz431Pd4OnLi0rkmSpNXkDZ4kSVKRIUGS\nJBUZEiRJUpEhQZIkFRkSJElSkSFBkiQVGRIkSVKRIUGSJBUZEiRJUpEhQZIkFRkSJElSkSFBkiQV\nGRIkSVKRIUGSJBUZEiRJUpEhQZIkFRkSJElSkSFBkiQVGRIkSVKRIUGSJBUZEiRJUpEhQZIkFRkS\nJElSkSFBkiQVGRIkSVKRIUGSJBUZEiRJUpEhQZIkFRkSJElSkSFBkiQVGRIkSVKRIUGSJBUZEiRJ\nUpEhQZIkFRkSJElSkSFBkiQVGRIkSVKRIUGSJBUZEiRJUpEhQZIkFTXrVI6IxwOXAs8C9gDXAK/P\nzP2FutcBpwMdoNH9enpmfnK5nZYkScNXKyQAHwG+CZwMHAlcCbSACwp1twAvBm7oKfvWEvooSZJW\nwaJDQkQE8FRgU2Y+0C17A3AxfSEhIjYAxwDbM/O+wXVXkiStlDprEu4FnjMfELoawKMLdQNoA/+6\njL5JkqRVtOiZhMzcCXx6/nFENIBXAZ8pVN8CzAAfjIhnAt8ALszMTy2rt5IkacXUXZPQ62LgOOAp\nheeeBEwCfwm8FTgD+EREbM3MW+tsZHzcEzDWg/lxHMXxbDYbjI01GB9rDLztsbEGzWaDZnP03pdR\nHlMdyPFcXwY1jo1Op1P7RRFxEfBa4MzM/NgCdR7dnX2Yf/xx4O7MPKfGpup3Thqw+++/n8/ecieH\nH3HkwNue/tY3+emf/AGOOuqogbct6WFv2X/Z1J5JiIjLgFcAZy8UEOChwxO9vgo8ue72ZmZmmZtr\n132Z1pjx8TE2bpwcyfGcnt7N7Ox+NkzsG3jbs7P7mZ7eTbM5NfC2h22Ux1QHcjzXl/nxXK6610m4\nEHg58AuZ+dGD1LsSaGfmS3uKjwO+UreDc3NtWi1/YdeLURzPVqtDu91hrj34ia12u0Or1Rm596TX\nKI6pFuZ4qledUyC3ANuAtwA3RsSm+ecyc0f38c7M3At8HLg6Ij4H3AicTXVthZcNsO+SJGmI6qxs\neF63/jbg7u6/e7pf6X5/JkB3luG8bt3bqK68eGpm3jmYbkuSpGGrcwrkRcBFB3l+rO/xFcAVS++a\nJElaTZ7rIkmSigwJkiSpyJAgSZKKDAmSJKnIkCBJkooMCZIkqciQIEmSigwJkiSpyJAgSZKKDAmS\nJKnIkCBJkooMCZIkqciQIEmSigwJkiSpyJAgSZKKDAmSJKnIkCBJkooMCZIkqciQIEmSigwJkiSp\nyJAgSZKKDAmSJKnIkCBJkooMCZIkqciQIEmSigwJkiSpyJAgSZKKDAmSJKnIkCBJkooMCZIkqciQ\nIEmSigwJkiSpyJAgSZKKDAmSJKnIkCBJkooMCZIkqciQIEmSigwJkiSpyJAgSZKKmnUqR8TjgUuB\nZwF7gGuA12fm/kLd44H3AccCtwPnZuaty+6xJElaEXVnEj4CPAI4GTgLOB14U3+liJgCrgc+D5wA\n3ARcHxGTy+qtJElaMYueSYiIAJ4KbMrMB7plbwAuBi7oq34WsCcz58vPj4ifAV4IXLXsXkuSpKGr\nM5NwL/Cc+YDQ1QAeXai7FfhiX9mXgJPqdU+SJK2WRc8kZOZO4NPzjyOiAbwK+Eyh+tFU6xB67QB+\nfAl9lCRJq6DWwsU+FwPHAU8pPDcF7Osr2wdMLGN7kiRpBS0pJETERcBrgDMz86uFKns5MBBMUJ0R\nUcv4uGdprgfz4ziK49lsNhgbazA+1hh422NjDZrNBs3m6L0vozymOpDjub4Mahxrh4SIuAx4BXB2\nZn5sgWp3AZv7yjYD99Td3saNnhCxnozieLZae5ic3MDU1OAnwvbv28Dhhx/GEUccNvC2V8oojqkW\n5niqV93rJFwIvBz4hcz86EGq3syBZzycDLy5XvdgZmaWubl23ZdpjRkfH2PjxsmRHM/p6d3Mzu5n\nw0T/EbTlm53dz/T0bprNqYG3PWyjPKY6kOO5vsyP53LVOQVyC7ANeAtwY0Rsmn8uM3d0H+/MzL3A\nh4G3RsQlwOXAOVTrFK6p28G5uTatlr+w68Uojmer1aHd7jDX7gy87Xa7Q6vVGbn3pNcojqkW5niq\nV52DFs/r1t8G3N39d0/3K93vzwTIzF3Ac4FnANuprq9wWmbODqbbkiRp2OqcAnkRcNFBnh/re7wd\nOHHpXZMkSavJZaySJKnIkCBJkooMCZIkqciQIEmSigwJkiSpyJAgSZKKDAmSJKnIkCBJkooMCZIk\nqciQIEmSigwJkiSpyJAgSZKKDAmSJKnIkCBJkooMCZIkqciQIEmSigwJkiSpyJAgSZKKDAmSJKnI\nkCBJkooMCZIkqciQIEmSigwJkiSpyJAgSZKKDAmSJKnIkCBJkooMCZIkqciQIEmSigwJkiSpyJAg\nSZKKDAmSJKnIkCBJkooMCZIkqciQIEmSigwJkiSpyJAgSZKKDAmSJKnIkCBJkooMCZIkqciQIEmS\nippLfWFETADbgVdm5hcWqHMdcDrQARrdr6dn5ieXul1JkrQylhQSugHhauDJh6i6BXgxcENP2beW\n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\nT/FxwFfqbHBmZpa5ufahK2pNGx8fY+PGyZEcz+np3czO7mfDRP+RtuWbnd3PeBP27BlO29PTu2k2\npwbeNoz2mOpAjuf6Mj+ey1UrJGTmbERcBbw/In4VeALw68BLACJiE7AzM/cCHweujojPUQWKs4GT\ngZfV2ebcXJtWy1/Y9WIUx7PV6tBud5hrdwbedqdTtTuMttvtDq1WZ+jv9yiOqRbmeKrXUg5avA74\nMtUFki4Dfjczr+s+dw9wJkBmfhQ4D9gG3EZ15cVTM/PO5XZakiQNX+0rLmbmLPAr3X/9z431Pb4C\nuGLJvZMkSavGZaySJKnIkCBJkooMCZIkqciQIEmSigwJkiSpyJAgSZKKDAmSJKnIkCBJkooMCZIk\nqciQIEmSigwJkiSpyJAgSZKKDAmSJKnIkCBJkooMCZIkqciQIEmSigwJkiSpyJAgSZKKDAmSJKnI\nkCBJkooMCZIkqciQIEmSigwJkiSpyJAgSZKKDAmSJKnIkCBJkooMCZIkqciQIEmSigwJkiSpyJAg\nSZKKDAmSJKnIkCBJkooMCZIkqciQIEmSigwJkiSpyJAgSZKKDAmSJKnIkCBJkooMCZIkqciQIEmS\nipp1XxARE8B7gTOAPcAfZOY7Fqh7PPA+4FjgduDczLx16d2VJEkrZSkzCW8HTgCeCZwHXBgRZ/RX\niogp4Hrg8936NwHXR8TkknsrSZJWTK2Q0P3gfynwmsz8x8y8Dngb8KpC9bOAPZl5QVbOB3YBL1xu\npyVJ0vDVnUn4CapDFDf1lH0R2Fqou7X7XK8vASfV3KYkSVoFdUPC0cADmdnqKdsBPCIijizUvbuv\nbAfwhJrblCRJq6DuwsUpYF9f2fzjiUXW7a93UOPjwzkB44EH7h9KuyobHx+j1drDrl2zzM21V7s7\ntczMPMjsnhnGxhoDb3t2zy7Gxzfw7ZlvDaHtGWZmJmg2B99vGO0x1YEcz9Xx2MceNZR2B/XZWTck\n7OXAD/n5x3sWWbe/3sE0Nm4czjrHI444bCjt6uCOGs7+MGRPZGvpgNpAjP7Rt9EcUy3E8VSvulHj\nLuCxEdH7us3AbGZOF+pu7ivbDNxTc5uSJGkV1A0J/wB8B3haT9lPAbcU6t4M/Oe+spO75ZIkaY1r\ndDqdWi+IiPdRfdj/KtUixA8AL8nM6yJiE7AzM/dGxKOA/wNcDVwOnAP8PPAjmTk7uB9BkiQNw1JW\n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\n3iruw0MQ6SQAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.distplot(results_df.intra_func_flops/1e9, bins=np.arange(10, 30), kde=False)" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2017-02-27T09:27:24.537559", "start_time": "2017-02-27T09:27:24.528708" } }, "source": [ "# scaling up\n", "Now we will run a very large number of lambdas simultaneously. Note that this is very dependent on the maximum number of simultaneous lambdas that AWS has enabled for your account. You can e-mail them and ask for a limit increase. Note that due to stragglers this can also take a while" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "ExecuteTime": { "end_time": "2017-02-27T10:01:42.382113", "start_time": "2017-02-27T09:57:50.492364" }, "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "('invocation done, dur=', 27.324092149734497)\n", "('callset id: ', '3f39c719-f8fc-4c5b-b218-9ea6ad4f5ba3')\n", "('total time', 230.5793092250824)\n", "16689.6618354 GFLOPS\n" ] } ], "source": [ "# My account has a lambda limit of 3000 simultaneous lambdas, so I'm using 2800 to give us some headroom\n", "!python flops_benchmark.py --workers=2800 --loopcount=10 --matn=4096 --outfile=\"big.pickle\"" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "ExecuteTime": { "end_time": "2017-02-27T10:07:16.204258", "start_time": "2017-02-27T10:07:15.477252" }, "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgkAAAF9CAYAAACOOfuyAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3X+UZGV95/F3dVem7UZbRoIzuGYj+fV1zLLhhwFZjKj5\nA8mKJmwkKJuYxBUBfwRNNsSEyFn1aBAjAv4K2UCWNSESRdFgzKpEjAIJI0mEQL7Z1RgNvxF7epjp\nmbG7av+41VgWz8x0dd2qrvS8X+f06a5bT9379PfcfurT9z73VqPdbiNJktRrYq07IEmSxpMhQZIk\nFRkSJElSkSFBkiQVGRIkSVKRIUGSJBUZEiRJUpEhQZIkFRkSJElSUbPfF0TEDwLvBU4Avgm8JzPf\nuZe2RwHvB44A7gDOzszbVt9dSZI0Kn0dSYiIBnA9cD9wJHAWcH5EnF5oO9NpeyNwNHAzcH1ETA/a\naUmSNHz9nm7YBPwtcE5mfiUzPwV8Fnh2oe3pwM7MPC8r5wLbgZcM1GNJkjQSfZ1uyMz7gJcuP46I\nE4DnUB1R6HUc8IWeZV8Ejgeu6q+bkiRp1FY9cTEivgZ8HrgJuLbQ5DDgnp5l9wNPXe02JUnS6Axy\ndcOpwCnAUcC7C8/PALt7lu0GpgbYpiRJGpG+r25YtnyVQkS8HvhgRPxqZi52NdnFYwPBFLBzpdto\nt9vtRqOx2i5qHXjwwQe57obbefwTnjjwuh7Zvo0XP/8IDj300Bp6Jmkt1DUmHCDjwcBvoH2FhIh4\nMnB8Zl7XtfhOYAMwCzzctfxuYHPPKjYD9650e41Gg/n5BZaWWv10U6s0OTnB7Oz0WNV8bm4Hk81p\nNkw9fuB1TS7sYW5uB83mTA09q8c41ny9s+ajV2fN6xoTxnE8qNNyzQfV75GEw4FrI+Kpmbn8Zv9M\n4MHMfLin7S3AeT3LTgDe2s8Gl5ZaLC76hzxK41TzxcU2rVabpVZ74HW1Wm0WF9tj87t1G6eaHyis\n+ejVUfO6xoRxHg/GSb8h4VZgK3BFRLyBKjS8g84bf0RsArZl5i7gw8DbI+Ji4HKqKyBmgGtq6rsk\nSRqiviYuZmYLeDGwg+qqhsuBd2fmezpN7gVO67TdDryQ6hLJrcCxwMmZuVBP1yVJ0jD1PXGxc6+E\nn93LcxM9j7cCx6yua5IkaS35AU+SJKnIkCBJkooMCZIkqciQIEmSigwJkiSpyJAgSZKKDAmSJKnI\nkCBJkooMCZIkqciQIEmSigwJkiSpyJAgSZKKDAmSJKnIkCBJkooMCZIkqciQIEmSigwJkiSpyJAg\nSZKKDAmSJKnIkCBJkooMCZIkqciQIEmSigwJkiSpyJAgSZKKDAmSJKnIkCBJkooMCZIkqciQIEmS\nigwJkiSpyJAgSZKKDAmSJKnIkCBJkooMCZIkqciQIEmSigwJkiSpyJAgSZKKDAmSJKnIkCBJkooM\nCZIkqciQIEmSipr9NI6IpwCXAs8DdgLXAG/MzD2FttcBpwBtoNH5fkpmfnLQTkuSpOHrKyQAHwG+\nCZwAHAJcCSwC5xXabgFeBtzQtexbq+ijJElaAysOCRERwLHApsx8qLPsTcBF9ISEiNgAHA5szcwH\n6uuuJEkalX7mJNwHvGA5IHQ0gCcW2gbQAr46QN8kSdIaWvGRhMzcBnx6+XFENIDXAJ8pNN8CzAMf\njIjnAt8ALsjMTw3UW0mSNDL9zknodhFwJPDMwnNPB6aBPwfeDpwKfCIijsvM2/rZyOSkF2CMynKt\nx6nmzWaDiYkGkxONgdc1MdGg2WzQbI7P7zeONV/vrPno1VnzusaEcRwP6lTX/r2qkBARFwKvA07L\nzLt6n8/MN0fEJZ2jDwC3R8QxwJnAWf1sa3Z2ejVd1ADGqeaLizuZnt7AzMzUwOvas3sDBx98EBs3\nHlRDz+o1TjU/UFjz0auj5nWNCeM8HoyTvkNCRFwGvAo4IzM/trd2XQFh2V3AM/rd3vz8AktLrX5f\nplWYnJxgdnZ6rGo+N7eDhYU9bJjaPfC6Fhb2MDe3g2Zzpoae1WMca77eWfPRq7PmdY0J4zge1Gm5\n5oPq9z4JF1AdDfi5zPzoPtpdCbQy8xVdi48EvtxvB5eWWiwu+oc8SuNU88XFNq1Wm6VWe+B1tVpt\nFhfbY/O7dRunmh8orPno1VHzusaEcR4Pxkk/l0BuAc4H3gbcFBGblp/LzPs7j7dl5i7g48DVEfE5\n4CbgDKp7K7yyxr5LkqQh6mdmw4s67c8H7ul83dv5Tufn0wA6RxnO6bS9nerOiydl5tfr6bYkSRq2\nfi6BvBC4cB/PT/Q8vgK4YvVdkyRJa2l9XvshSZIGZkiQJElFhgRJklRkSJAkSUWGBEmSVGRIkCRJ\nRYYESZJUZEiQJElFhgRJklRkSJAkSUWGBEmSVGRIkCRJRYYESZJUZEiQJElFhgRJklRkSJAkSUWG\nBEmSVGRIkCRJRYYESZJUZEiQJElFhgRJklRkSJAkSUWGBEmSVGRIkCRJRYYESZJUZEiQJElFhgRJ\nklRkSJAkSUWGBEmSVGRIkCRJRYYESZJUZEiQJElFhgRJklRkSJAkSUWGBEmSVGRIkCRJRYYESZJU\nZEiQJElFhgRJklTU7KdxRDwFuBR4HrATuAZ4Y2buKbQ9Cng/cARwB3B2Zt42cI8lSdJI9Hsk4SPA\n44ATgNOBU4C39DaKiBngeuBG4GjgZuD6iJgeqLeSJGlkVnwkISICOBbYlJkPdZa9CbgIOK+n+enA\nzsxcXn5uRPwU8BLgqoF7LUmShq6fIwn3AS9YDggdDeCJhbbHAV/oWfZF4Pj+uidJktbKio8kZOY2\n4NPLjyOiAbwG+Eyh+WFU8xC63Q/86Cr6KEmS1kBfExd7XAQcCTyz8NwMsLtn2W5gaoDtSZKkEVpV\nSIiIC4HXAadl5l2FJrt4bCCYoroioi+Tk16lOSrLtR6nmjebDSYmGkxONAZe18REg2azQbM5Pr/f\nONZ8vbPmo1dnzesaE+ocD1qtFg8//M2B1wPwpCcdwsTE4H2qa//uOyRExGXAq4AzMvNje2l2N7C5\nZ9lm4N5+tzc76wURozZONV9c3Mn09AZmZgY/CLVn9wYOPvggNm48qIae1Wucan6gsOajV0fN6xoT\n6hwPHnzwQW687as8/gmlKXor98j2bbz4+QdxyCGHDtynuvR7n4QLgDOBn8vMj+6j6S089oqHE4C3\n9tc9mJ9fYGmp1e/LtAqTkxPMzk6PVc3n5nawsLCHDVO9Z6/6t7Cwh7m5HTSbMzX0rB7jWPP1zpqP\nXp01r2tMqHM8mJvbwWRzmg1Tjx9oPZM19mm55oPq5xLILcD5wNuAmyJi0/JzmXl/5/G2zNwFfBh4\ne0RcDFwOnEU1T+Gafju4tNRicdE/5FEap5ovLrZptdostdoDr6vVarO42B6b363bONX8QGHNR6+O\nmtc1JtQ5Hoxjn+rSz0mLF3Xanw/c0/m6t/Odzs+nAWTmduCFwHOArVT3Vzg5Mxfq6bYkSRq2fi6B\nvBC4cB/PT/Q83gocs/quSZKkteT0XkmSVGRIkCRJRYYESZJUZEiQJElFhgRJklRkSJAkSUWGBEmS\nVGRIkCRJRYYESZJUZEiQJElFhgRJklRkSJAkSUWGBEmSVGRIkCRJRYYESZJUZEiQJElFhgRJklRk\nSJAkSUWGBEmSVGRIkCRJRYYESZJUZEiQJElFhgRJklRkSJAkSUWGBEmSVGRIkCRJRYYESZJUZEiQ\nJElFhgRJklRkSJAkSUWGBEmSVGRIkCRJRYYESZJUZEiQJElFhgRJklRkSJAkSUWGBEmSVGRIkCRJ\nRYYESZJUZEiQJElFzdW+MCKmgK3AqzPz83tpcx1wCtAGGp3vp2TmJ1e7XUmSNBqrCgmdgHA18Iz9\nNN0CvAy4oWvZt1azTUmSNFp9h4SI2AL88QrabQAOB7Zm5gOr6JskSVpDq5mTcCLwWeB4qlMIexNA\nC/jqKrYhSZLWWN9HEjLzA8s/R8S+mm4B5oEPRsRzgW8AF2Tmp/rdpiRJGr1VT1xcgacD08CfA28H\nTgU+ERHHZeZtK13J5KQXYIzKcq3HqebNZoOJiQaTE/s6aLUyExMNms0Gzeb4/H7jWPP1zpqPXp01\nr2tMqHM8GMc+1bV/Dy0kZOabI+KSzNzWWXR7RBwDnAmctdL1zM5OD6V/2rtxqvni4k6mpzcwMzM1\n8Lr27N7AwQcfxMaNB9XQs3qNU80PFNZ89OqoeV1jQp3jwTj2qS7DPJJAV0BYdhf7vyLiu8zPL7C0\n1KqvU9qryckJZmenx6rmc3M7WFjYw4ap3QOva2FhD3NzO2g2Z2roWT3GsebrnTUfvTprXteYUOd4\nMI59Wq75oIYWEiLiSqCVma/oWnwk8OV+1rO01GJx0T/kURqnmi8utmm12iy12gOvq9Vqs7jYHpvf\nrds41fxAYc1Hr46a1zUm1DkejGOf6lJrSIiITcC2zNwFfBy4OiI+B9wEnAGcALyyzm1KkqThGHRm\nQ29suhc4DSAzPwqcA5wP3E5158WTMvPrA25TkiSNwEBHEjJzsufxRM/jK4ArBtmGJElaG14DJEmS\nigwJkiSpyJAgSZKKDAmSJKnIkCBJkooMCZIkqciQIEmSigwJkiSpyJAgSZKKDAmSJKnIkCBJkooM\nCZIkqciQIEmSigwJkiSpyJAgSZKKDAmSJKnIkCBJkooMCZIkqciQIEmSigwJkiSpyJAgSZKKDAmS\nJKnIkCBJkooMCZIkqciQIEmSigwJkiSpyJAgSZKKDAmSJKnIkCBJkooMCZIkqciQIEmSigwJkiSp\nyJAgSZKKDAmSJKnIkCBJkooMCZIkqciQIEmSigwJkiSpyJAgSZKKDAmSJKmoudoXRsQUsBV4dWZ+\nfi9tjgLeDxwB3AGcnZm3rXabkiRpdFZ1JKETEK4GnrGPNjPA9cCNwNHAzcD1ETG9mm1KkqTR6jsk\nRMQW4Bbg8P00PR3YmZnnZeVcYDvwkv67KUmSRm01RxJOBD4LHA809tHuOOALPcu+2HmdJEkac33P\nScjMDyz/HBH7anoY1TyEbvcDP9rvNiVJ0uiteuLiCswAu3uW7Qam+lnJ5KQXYIzKcq3HqebNZoOJ\niQaTE/s6aLVSbebnH6bZHHxdT3rSIUxMDF6ncaz5emfNR6/Omtc3JtQ3HszPP0yjwcB9mpho0Gw2\naDbrG1sGNcyQsIvHBoIpYGc/K5mddZ7jqI1TzRcXdzI9vYGZmb6yZdFDDyxwy50Ps2nTYOt5ZPs2\nXvz8gzjkkEMH7tOycar5gcKaj14dNa9rTKhrPAC49+5/YfbgQwbu057dGzj44IPYuPGgwTtVk2GG\nhLuBzT3LNgP39rOS+fkFlpZatXVKezc5OcHs7PRY1XxubgcLC3vYMNV7UKp/Cwt7mGxOs2Hq8QOt\nZ3JhD3NzO2g2Zwbu0zjWfL2z5qNXZ83rGhPqGg8AJiYfx8LCt9m5c/A+1T22DGqYIeEW4LyeZScA\nb+1nJUtLLRYX/UMepXGq+eJim1arzVKrPfC62u1qPYOuq9Vqs7jYrrVG41TzA4U1H706al7XmFDX\neFDnuoYxtgyq1pAQEZuAbZm5C/gw8PaIuBi4HDiLap7CNXVuU5IkDcegMxt6Y9O9wGkAmbkdeCHw\nHKo7Mx4LnJyZCwNuU5IkjcBARxIyc7Ln8UTP463AMYNsQ5IkrQ2vAZIkSUWGBEmSVGRIkCRJRYYE\nSZJUZEiQJElFhgRJklRkSJAkSUWGBEmSVGRIkCRJRYYESZJUZEiQJElFhgRJklRkSJAkSUWGBEmS\nVGRIkCRJRYYESZJUZEiQJElFhgRJklRkSJAkSUWGBEmSVGRIkCRJRYYESZJUZEiQJElFhgRJklRk\nSJAkSUWGBEmSVGRIkCRJRYYESZJUZEiQJElFhgRJklRkSJAkSUWGBEmSVGRIkCRJRYYESZJUZEiQ\nJElFhgRJklRkSJAkSUWGBEmSVGRIkCRJRc1+XxARU8D7gFOBncDvZua79tL2OuAUoA00Ot9PycxP\nrrrHkiRpJPoOCcA7gaOB5wJPA66KiK9l5rWFtluAlwE3dC371iq2KUmSRqyvkBARM8ArgJMy8++B\nv4+IdwCvAa7tabsBOBzYmpkP1NRfSZI0Iv3OSfgxqmBxc9eyLwDHFdoG0AK+urquSZKktdRvSDgM\neCgzF7uW3Q88LiIO6Wm7BZgHPhgR90TEX0fECwboqyRJGqF+Q8IMsLtn2fLjqZ7lTwemgT8HTgI+\nCXwiIo7ut5OSJGn0+p24uIvHhoHlxzu7F2bmmyPikszc1ll0e0QcA5wJnLXSDU5OepXmqCzXepxq\n3mw2mJhoMDnRGHhdjUa1nkHXNTHRoNls0GwOXqdxrPl6Z81Hr86a1zUm1DUe1LmuYYwtg+o3JNwN\nfG9ETGRmq7NsM7CQmXO9jbsCwrK7gGf0s8HZ2ek+u6hBjVPNFxd3Mj29gZmZ3mzav+npDUw2v2fg\nde3ZvYGDDz6IjRsPGrhPy8ap5gcKaz56ddS8rjGhrvGgznUNY2wZVL8h4e+AbwPPAm7qLPsJ4Nbe\nhhFxJdDKzFd0LT4S+HI/G5yfX2BpqbX/hhrY5OQEs7PTY1XzubkdLCzsYcNU71mu/i0s7GGyCTt3\nDrauhYU9zM3toNmcGbhP41jz9c6aj16dNa9rTKhrPKhzXcMYWwbVV0jIzIWIuAr4QET8MvBU4FeB\nlwNExCZgW2buAj4OXB0Rn6MKFGcAJwCv7GebS0stFhf9Qx6lcar54mKbVqvNUqs98Lra7Wo9g66r\n1WqzuNiutUbjVPMDhTUfvTpqXteYUNd4UOe6hjG2DGo1Jy3eAHyJ6gZJlwG/nZnXdZ67FzgNIDM/\nCpwDnA/cTnXnxZMy8+uDdlqSJA1f33dczMwF4Jc6X73PTfQ8vgK4YtW9kyRJa8bpvZIkqciQIEmS\nigwJkiSpyJAgSZKKDAmSJKnIkCBJkooMCZIkqciQIEmSigwJkiSpyJAgSZKKDAmSJKnIkCBJkooM\nCZIkqciQIEmSigwJkiSpyJAgSZKKDAmSJKnIkCBJkooMCZIkqciQIEmSigwJkiSpyJAgSZKKDAmS\nJKnIkCBJkooMCZIkqciQIEmSigwJkiSpyJAgSZKKDAmSJKnIkCBJkooMCZIkqciQIEmSigwJkiSp\nyJAgSZKKDAmSJKnIkCBJkooMCZIkqciQIEmSigwJkiSpyJAgSZKKmv2+ICKmgPcBpwI7gd/NzHft\npe1RwPuBI4A7gLMz87bVd1eSJI3Kao4kvBM4GngucA5wQUSc2tsoImaA64EbO+1vBq6PiOlV91aS\n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\nAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "big_exp_results = pickle.load(open(\"big.pickle\", 'r'))\n", "big_results_df = flops_benchmark.results_to_dataframe(big_exp_results)\n", "sns.distplot(results_df.intra_func_flops/1e9, bins=np.arange(10, 36), kde=False)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "ExecuteTime": { "end_time": "2017-02-27T10:20:59.609352", "start_time": "2017-02-27T10:20:59.602174" }, "collapsed": false }, "outputs": [], "source": [ "est_total_flops = big_results_df['est_flops']\n", "total_jobs = len(big_results_df)\n", "JOB_GFLOPS = est_total_flops /1e9 /total_jobs " ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "ExecuteTime": { "end_time": "2017-02-27T10:38:16.971213", "start_time": "2017-02-27T10:38:15.463955" }, "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# grid jobs running time \n", "\n", "time_offset = np.min(big_results_df.host_submit_time)\n", "max_time = np.max(big_results_df.download_output_timestamp ) - time_offset\n", "runtime_bins = np.linspace(0, max_time, max_time, endpoint=False)\n", "\n", "\n", "runtime_flops_hist = np.zeros((len(big_results_df), len(runtime_bins)))\n", "for i in range(len(big_results_df)):\n", " row = big_results_df.iloc[i]\n", " s = (row.start_time + row.setup_time) - time_offset\n", " e = row.end_time - time_offset\n", " a, b = np.searchsorted(runtime_bins, [s, e])\n", " if b-a > 0:\n", " runtime_flops_hist[i, a:b] = row.est_flops / float(b-a)\n", " \n", "results_by_endtime = big_results_df.sort_values('download_output_timestamp')\n", "results_by_endtime['job_endtime_zeroed'] = big_results_df.download_output_timestamp - time_offset\n", "results_by_endtime['flops_done'] = results_by_endtime.est_flops.cumsum()\n", "results_by_endtime['rolling_flops_rate'] = results_by_endtime.flops_done/results_by_endtime.job_endtime_zeroed\n", "\n", " \n", "fig = pylab.figure(figsize=(4, 3))\n", "ax = fig.add_subplot(1, 1, 1)\n", "ax.plot(runtime_flops_hist.sum(axis=0)/1e9, label='peak GFLOPS')\n", "ax.plot(results_by_endtime.job_endtime_zeroed, \n", " results_by_endtime.rolling_flops_rate/1e9, label='effective GFLOPS')\n", "ax.set_xlabel('time (sec)')\n", "ax.set_ylabel(\"GFLOPS\")\n", "pylab.legend()\n", "ax.grid(False)\n", "sns.despine()\n", "fig.tight_layout()\n", "fig.savefig(\"flops_benchmark.gflops.png\")\n", "fig.savefig(\"flops_benchmark.gflops.pdf\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This plot computes two things:\n", "* **Peak GLFOPS**: Across all cores, what is the total simultaneous FLOPS that are being computed? \n", "* **Effective GFLOPS**: If the job ended at this point in time, what would our aggregate effective GFLOPS have been, including time to launch the jobs and download the results\n", "\n", "We see \"peak GFLOPS\" peaks in the middle of the job, when all 2800 lambdas are running at once. \"Effective GFLOPS\" starts climbing as results quickly return, but stragglers mean that in reality our total effective GFLOPS for the job is only ~20GFLOPS. Still not bad for pure python! " ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python [default]", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.12" }, "toc": { "nav_menu": { "height": "66px", "width": "252px" }, "navigate_menu": true, "number_sections": true, "sideBar": true, "threshold": 4, "toc_cell": false, "toc_section_display": "block", "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 1 }