Skip to content

Instantly share code, notes, and snippets.

@brandon-b-miller
Created May 27, 2021 18:52
Show Gist options
  • Save brandon-b-miller/71ce300856666245103c785e236d4c1b to your computer and use it in GitHub Desktop.
Save brandon-b-miller/71ce300856666245103c785e236d4c1b to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "dfe689e7",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import random\n",
"import torch\n",
"import cudf\n",
"from nvtx import annotate\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# corpus we need for the numpy version\n",
"corpus_for_numpy = np.array([['BRANDON', 'NIKHIL'] * 150000,\n",
" ['brandon-b-miller', 'NikhilKothari'] * 150000,\n",
" ['1', '0'] * 150000])\n",
"\n",
"# the same corpus as above for cudf version\n",
"corpus_for_cudf = cudf.DataFrame({\"person_info\": ['BRANDON', 'NIKHIL'] * 150000, \n",
" \"git_user_name\": ['brandon-b-miller', 'NikhilKothari'] * 150000, \n",
" \"score\": [1, 0] * 150000})\n",
"\n",
"# indices coming from pytorch on GPU\n",
"# need to index the corpus with these\n",
"idx = torch.tensor(random.sample(range(0, 299999), 200), device='cuda')\n",
"\n",
"query = 'BRAN'\n",
"\n",
"# numpy version of the solution\n",
"def numpy_version(corpus, idx, query):\n",
" cut = corpus[:, idx.tolist()]\n",
" cut[2, 35:] = \"0.0\"\n",
"\n",
" match = np.char.find(cut[0], query)\n",
" score = (\n",
" (match >= 0) * 10\n",
" + cut[2].astype(float)\n",
" ) / 11\n",
"\n",
" result = []\n",
"\n",
" for i in range(200):\n",
" res = {\n",
" \"person_info\": cut[0][i],\n",
" \"git_user_name\": cut[1][i],\n",
" \"score\": score[i],\n",
" }\n",
"\n",
" result.append(res)\n",
"\n",
" return result\n",
"\n",
"# cudf version of the same solution\n",
"@annotate(\"READ_CSV\", color=\"purple\", domain=\"cudf_python\")\n",
"def cudf_version(corpus, idx, query):\n",
" cut = corpus.iloc[idx]\n",
" cut[\"score\"].iloc[35:] = 0\n",
" cut[\"score\"] = (cut[\"person_info\"].str.contains(query) * 10 + cut[\"score\"]) / 11\n",
" # return cut.to_json(orient=\"records\") # ignoring since this happens on cpu and takes even longer\n",
" return cut"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "c46980b0",
"metadata": {},
"outputs": [],
"source": [
"def runner(which='cudf', idx_size=200):\n",
" idx = torch.tensor(random.sample(range(0, 299999), idx_size), device='cuda')\n",
" \n",
" if which == 'cudf':\n",
" results = %timeit -o cudf_version(corpus_for_cudf, idx, query)\n",
" elif which == 'numpy':\n",
" results = %timeit -o numpy_version(corpus_for_numpy, idx, query)\n",
" return results.average"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "488a457b",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.44 ms ± 19 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n",
"3.75 ms ± 90.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
"11.9 ms ± 143 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
"3.73 ms ± 37.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
"66.2 ms ± 2.47 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n",
"7.03 ms ± 1.35 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
"131 ms ± 3.07 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n",
"9.22 ms ± 1.18 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
"282 ms ± 5.12 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n",
"12.5 ms ± 1.37 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
"346 ms ± 10 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n",
"8.69 ms ± 551 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
]
}
],
"source": [
"results_np = []\n",
"results_gd = []\n",
"sizes =[1000, 10000, 50000, 100000, 200000, 250000]\n",
"for isize in sizes:\n",
" isize = int(isize)\n",
" results_np.append(runner(which='numpy', idx_size=isize))\n",
" results_gd.append(runner(which='cudf',idx_size=isize))"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "28ec6862",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[0.0014369240695876735,\n",
" 0.011872151541922773,\n",
" 0.0661932187021843,\n",
" 0.13142624128875988,\n",
" 0.28201937675476074,\n",
" 0.34587682836822103]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"results_np"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "d5668263",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[0.0037518624096576658,\n",
" 0.003731692119368485,\n",
" 0.007034750832244753,\n",
" 0.009217238037713935,\n",
" 0.012543581717514565,\n",
" 0.008693852861012732]"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"results_gd"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "7b0e0f81",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABJoAAAJSCAYAAACLAq9lAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAB3FklEQVR4nOzdd3yV5fnH8c+dBAIIAipSFVEQt60rWq1bcRSsq61atSIO3APEKqLiRkUUFBy4xSquqqBV62ytdUF/rqpUxAHUASo4CCPJ/fvjDhIggQSS82R83q8Xr5Pnep5zzoV6DHxz39cTYoxIkiRJkiRJKyov6wYkSZIkSZLUOBg0SZIkSZIkqVYYNEmSJEmSJKlWGDRJkiRJkiSpVhg0SZIkSZIkqVYYNEmSJEmSJKlWFGTdQF1abbXV4rrrrpt1G5IkSZIkSY3GhAkTZsQYO1R2rlEHTeuuuy7jx4/Pug1JkiRJkqRGI4TwaVXn3DonSZIkSZKkWmHQJEmSJEmSpFph0CRJkiRJkqRaYdAkSZIkSZKkWmHQJEmSJEmSpFph0CRJkiRJkqRaUZB1A1mbM2cO06dPZ86cOZSUlGTdjmqgWbNmrL766qy88spZtyJJkiRJkmjiQdOsWbP48ssv6dChAz/72c8oKCgghJB1W6qGGCPFxcVMmzYNwLBJkiRJkqR6oElvnZsxYwadOnWiffv2NGvWzJCpAQkh0KpVK9Zaay2++uqrrNuRJEmSJEk08aBp3rx5tGzZMus2tAJatmzJ/Pnzs25DkiRJkiTRxIMmwFVMDZz//iRJkiRJqj+afNAkSZIkSZKk2mHQJEmSJEmSpFqR86AphLBPCGFiCGFSCOGcSs6fEEJ4J4TwZgjhnyGETcrr64YQisvrb4YQbsp175IkSZIkSapaToOmEEI+MBL4NbAJ8IcFQVIF98YYfx5j3AK4CrimwrmPYoxblP86ISdNL4dZs+DAA9OjJEmSJElSU5HrFU3bApNijJNjjPOAMcD+FS+IMX5X4XAlIOawv1oxdiw8+iiMG5d1J5IkSZIkSbmT66BpLWBKheOp5bVFhBBODiF8RFrRdFqFU11CCP8XQvh7CGGnum11+d1++6KPuXThhRcSQuDDDz+kZ8+etG7dmnXWWYeLL76YsrIyAO68805CCHzyySeVPreiEALnnXceQ4cOZZ111qFVq1b07NmTr776iq+++oqDDz6Ytm3bsvbaa3PllVcu8twF7/OPf/yDAw44gNatW7Pqqqty8sknU1xcDMDcuXPp0KEDffv2XeL3suD5H3zwQS3+E5IkSZIkSXWlXg4DjzGOjDGuB5wNnFde/hzoHGPcEugH3BtCWHnx54YQ+oQQxocQxk+fPj0n/XbvDiEs/PWvf6X6yy8vWu/ePSftAHDggQey++678+ijj3LAAQcwaNAg7rrrruV6rdGjR/P8889zww03MGLECF566SWOPPJIDjzwQH7xi1/w8MMP06NHD8455xz++te/LvH8I444gm7duvGXv/yFvn37csstt3DiiScCUFhYSO/evbn77ruZM2fOIs+7+eab2WWXXdhoo42Wq29JkiRJkpRbuQ6apgFrVzjuVF6ryhjgAIAY49wY49flX08APgI2WPwJMcZRMcaiGGNRhw4dlqvJiuFQdX4999yiz583b9HHBZ57rmavuyLOPPNMzjzzTLp3787w4cPZbLPNuO+++5brtQoLC3nsscfo2bMnRx99NMceeyxPP/00v/71rznvvPPo3r07I0eOpEOHDjz44INLPL9Hjx5cffXV7LXXXpx33nkMGjSI0aNH89///heAE044gZkzZy7y3LfffptXX32VE06ot6O4JEmSJEmqtqYyzznXQdMbwPohhC4hhObAocDYiheEENavcNgT+LC83qF8mDghhK7A+sDknHTdAPXs2XOR480224zPPvtsuV5rzz33pKCg4KfjBSuM9t57759qBQUFdOvWjSlTpizx/IMPPniR40MPPZSysjJef/11ALp27cree+/NzTff/NM1N998Mx06dOCggw5arp4lSZIkSapPmso855wGTTHGEuAU4GngfeCBGON/QggXhxD2K7/slBDCf0IIb5K2yPUqr+8MvF1efwg4Icb4Td30uXy/xo2DFi0Wfa0WLVJ9eV5vRayyyiqLHBcWFi6xNa262rdvv8hx8+bNq6xX9h4dO3as9HjatIWL2U466SRefvll3n33XX788Ufuueceevfu/dN7SZIkSZLUkGU5zzmXCpZ9Se2KMf4V+OtitQsqfH16Fc97GHi4brtbMTNnQkEB5OVBYSHMnZuOZ87MurNFtShPw+Yttrfv66+/rpP3+/LLL9l0000XOQZYa62Fc+B79OjBuuuuy80338zmm2/O999/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25OXl8e0adOqvKZFixbMm7fotr6vF3xSy6222mo0a9aML7/8connf/nll6yzzjq107AkSZIkSVV47z249loYPRrmzk21bbZJ85d++9u0XU71i1vnatEb025jfuls1mizOUdu+RhrtNmc+aWzc3r3uVatWrHjjjtyzz33UFxcXOk166yzDu++++4itSeeeGKR4/z8fLbZZhseeughysrKfqq/9tprfPLJJ7XetyRJkiRJADHC889Dz56w6aZw660wb17aKvf3v8Nrr8Ehhxgy1Vf+a6lFLQra0mODIey4zhnkhTy6bbc7//x0GB9/+1JO+7j66qvZZZdd2H777TnzzDPp1KkTkydP5s033+T666/n0EMP5eijj6Zv377su+++vPXWW9x5551LvM5FF13EXnvtxQEHHMDxxx/P9OnTGTRoED/72c9y+vuRJEmSJDV+8+fD/fenAd9vvplqLVrAUUdB376wwQZZdqfqMmiqRb22fHSR47yQz87rnsnO656Z0z622WYbXn75ZS644AJOPfVU5s6dyzrrrEPv3r1Tn716MWXKFG677TZuvvlmdtppJx555BG6deu2yOt0796dP//5z1x44YUcdNBBdOvWjWHDhjF8+PCc/n4kSZIkSY3XzJlwyy0wfDgsmAKz+upwyilw4omw2mqZtqcaCjEu3+DrhqCoqCiOHz++yvPvv/8+G2+8cQ47Ul3w36MkSZIkNTyffJLCpVtvhR9+SLWNN07zlw4/PK1mUv0UQpgQYyyq7JwrmiRJkiRJUs68/nraHvfQQ7BgJPDuu6eAaZ99IM9p0g2aQZMkSZIkSapTpaUwblwKmP75z1QrKIDDDksB0xZbZNqeapFBkyRJkiRJqhOzZ8Ndd8G118KHH6Za27Zw/PFw6qnQqVO2/an2GTRJkiRJkqRa9eWXMGIE3HgjfP11qq2zTrp73NFHQ5s22fanumPQJEmSJEmSasV//gPXXAP33APz5qXattum7XEHHZS2y6lxa/L/imOMhBCybkPLqTHfNVGSJEmSGoIY4fnn4eqr4amnUi0EOOCAFDDtsEM6VtPQpIOm5s2bU1xcTKtWrbJuRcupuLiYZs2aZd2GJEmSJDU58+bB/fenAd9vvZVqLVtC795wxhmw/vqZtqeMNOmgabXVVmPq1KmsttpqtGnThoKCAlc3NRAxRoqLi5k2bRod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\n",
"text/plain": [
"<Figure size 1440x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots(figsize=(20,10))\n",
"plt.plot(sizes, results_np, label='numpy', color='blue', marker='*', lw=2, markersize=10)\n",
"plt.plot(sizes, results_gd, label='cudf', color='#76B900', marker='*', lw=2, markersize=10)\n",
"plt.xlabel('Index Size', fontsize=16)\n",
"plt.ylabel('Mean Runtime (s)', fontsize=16)\n",
"plt.legend(loc='upper left', fontsize=16)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8a06e918",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "75300926",
"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.8.10"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment