|
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 20,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Wed Jul 1 11:16:12 2020 \n",
|
|
"+-----------------------------------------------------------------------------+\n",
|
|
"| NVIDIA-SMI 440.82 Driver Version: 440.82 CUDA Version: 10.2 |\n",
|
|
"|-------------------------------+----------------------+----------------------+\n",
|
|
"| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n",
|
|
"| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n",
|
|
"|===============================+======================+======================|\n",
|
|
"| 0 GeForce GTX 106... Off | 00000000:01:00.0 On | N/A |\n",
|
|
"| 0% 49C P2 26W / 120W | 2808MiB / 3016MiB | 2% Default |\n",
|
|
"+-------------------------------+----------------------+----------------------+\n",
|
|
" \n",
|
|
"+-----------------------------------------------------------------------------+\n",
|
|
"| Processes: GPU Memory |\n",
|
|
"| GPU PID Type Process name Usage |\n",
|
|
"|=============================================================================|\n",
|
|
"| 0 1972 G /usr/libexec/Xorg 59MiB |\n",
|
|
"| 0 2361 G /usr/libexec/Xorg 280MiB |\n",
|
|
"| 0 2485 G /usr/bin/gnome-shell 231MiB |\n",
|
|
"| 0 3214 G ...uest-channel-token=15065411588967843042 23MiB |\n",
|
|
"| 0 4090 G /usr/lib64/firefox/firefox 12MiB |\n",
|
|
"| 0 4151 G /usr/lib64/firefox/firefox 2MiB |\n",
|
|
"| 0 4194 G /usr/lib64/firefox/firefox 2MiB |\n",
|
|
"| 0 4917 G /usr/lib64/firefox/firefox 2MiB |\n",
|
|
"| 0 5777 G /usr/lib64/firefox/firefox 2MiB |\n",
|
|
"| 0 33033 G /usr/lib64/firefox/firefox 4MiB |\n",
|
|
"| 0 37575 G /usr/lib64/firefox/firefox 167MiB |\n",
|
|
"| 0 37626 G /usr/lib64/firefox/firefox 2MiB |\n",
|
|
"| 0 50906 G ...quest-channel-token=3573384613177380021 121MiB |\n",
|
|
"| 0 90844 C /home/jeff/Documents/python/ml/bin/python 1881MiB |\n",
|
|
"+-----------------------------------------------------------------------------+\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"!nvidia-smi"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"True\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"import torch\n",
|
|
"\n",
|
|
"print(torch.cuda.is_available())"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import time # times in seconds\n",
|
|
"def time_torch(size):\n",
|
|
" x = torch.rand(size, size, device=torch.device(\"cuda\"))\n",
|
|
" start = time.time()\n",
|
|
" x.sin_()\n",
|
|
" end = time.time()\n",
|
|
" return(end - start)\n",
|
|
"\n",
|
|
"def time_cpu(size):\n",
|
|
" x = torch.rand(size, size, device=torch.device(\"cpu\"))\n",
|
|
" start = time.time()\n",
|
|
" x.sin_()\n",
|
|
" end = time.time()\n",
|
|
" return(end - start)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"([0.00028634071350097656, 1.049041748046875e-05, 4.291534423828125e-06, 4.0531158447265625e-06], [3.9577484130859375e-05, 1.0728836059570312e-05, 1.0013580322265625e-05, 1.0013580322265625e-05])\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"def get_cuda_cpu_times(sizes):\n",
|
|
" cpuTimes = []\n",
|
|
" cudaTimes = []\n",
|
|
"\n",
|
|
" for s in sizes:\n",
|
|
" cpuTimes += [time_cpu(s)]\n",
|
|
" cudaTimes += [time_torch(s)]\n",
|
|
" return cpuTimes, cudaTimes\n",
|
|
"\n",
|
|
"print(get_cuda_cpu_times(range(2, 10, 2)))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 122,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import matplotlib.pyplot as plt\n",
|
|
"\n",
|
|
"\n",
|
|
"def plot_cuda_vs_cpu(cpuTimes, cudaTimes, sizes, xLab=\"Matrix Width\"):\n",
|
|
" plt.title(\"CUDA vs CPU\")\n",
|
|
" cpu_plot = plt.plot(sizes, cpuTimes, label=\"CPU\")\n",
|
|
" cuda_plot = plt.plot(sizes, cudaTimes, label=\"CUDA\")\n",
|
|
" plt.legend(bbox_to_anchor=(0.8, 0.98), loc='upper left', borderaxespad=0.)\n",
|
|
" # plt.legend(handles=[cpu_plot, cuda_plot])\n",
|
|
" plt.xlabel(xLab)\n",
|
|
" plt.ylabel('Execution Time (Seconds)')\n",
|
|
" plt.show()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 62,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"sizes = range(1, 50, 1)\n",
|
|
"cpu_t, cuda_t = get_cuda_cpu_times(sizes)\n",
|
|
"plot_cuda_vs_cpu(cpu_t, cuda_t, sizes)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 64,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"sizes = range(1, 5000, 100)\n",
|
|
"cpu_t, cuda_t = get_cuda_cpu_times(sizes)\n",
|
|
"plot_cuda_vs_cpu(cpu_t, cuda_t, sizes)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 73,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"# cpu_plot = plt.plot(sizes, cpuTimes, label=\"CPU\")\n",
|
|
"cuda_plot = plt.plot(sizes, cuda_t, label=\"CUDA\")\n",
|
|
"plt.legend(bbox_to_anchor=(0.8, 0.98), loc='upper left', borderaxespad=0.)\n",
|
|
"# plt.legend(handles=[cpu_plot, cuda_plot])\n",
|
|
"plt.xlabel('Matrix Size')\n",
|
|
"plt.ylabel('Execution Time (Seconds)')\n",
|
|
"plt.show()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 85,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"0.00036406517028808594"
|
|
]
|
|
},
|
|
"execution_count": 85,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"import time # times in seconds\n",
|
|
"def time_torch_copy(size):\n",
|
|
" x = torch.rand(size, size, device=torch.device(\"cpu\"))\n",
|
|
" start = time.time()\n",
|
|
" x = x.cuda()\n",
|
|
" x.sin_()\n",
|
|
" end = time.time()\n",
|
|
" return(end - start)\n",
|
|
"time_torch_copy(2)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 86,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"def get_cuda_cpu_times_with_copy(sizes):\n",
|
|
" cpuTimes = []\n",
|
|
" cudaTimes = []\n",
|
|
" for s in sizes:\n",
|
|
" cpuTimes += [time_cpu(s)]\n",
|
|
" cudaTimes += [time_torch_copy(s)]\n",
|
|
" return cpuTimes, cudaTimes\n",
|
|
"\n",
|
|
"sizes = range(1, 5000, 100)\n",
|
|
"cpu_t, cuda_t = get_cuda_cpu_times_with_copy(sizes)\n",
|
|
"plot_cuda_vs_cpu(cpu_t, cuda_t, sizes)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 88,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"import time # times in seconds\n",
|
|
"def time_torch_copy_and_back(size):\n",
|
|
" x = torch.rand(size, size, device=torch.device(\"cpu\"))\n",
|
|
" start = time.time()\n",
|
|
" x = x.cuda()\n",
|
|
" x.sin_()\n",
|
|
" x = x.cpu()\n",
|
|
" end = time.time()\n",
|
|
" return(end - start)\n",
|
|
"time_torch_copy(2)\n",
|
|
"\n",
|
|
"def get_cuda_cpu_times_with_copy(sizes):\n",
|
|
" cpuTimes = []\n",
|
|
" cudaTimes = []\n",
|
|
" for s in sizes:\n",
|
|
" cpuTimes += [time_cpu(s)]\n",
|
|
" cudaTimes += [time_torch_copy_and_back(s)]\n",
|
|
" return cpuTimes, cudaTimes\n",
|
|
"\n",
|
|
"sizes = range(1, 5000, 100)\n",
|
|
"cpu_t, cuda_t = get_cuda_cpu_times_with_copy(sizes)\n",
|
|
"plot_cuda_vs_cpu(cpu_t, cuda_t, sizes)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 95,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def time_torch_operation_repetition(size, iterations):\n",
|
|
" x = torch.rand(size, size, device=torch.device(\"cpu\"))\n",
|
|
" start = time.time()\n",
|
|
" x = x.cuda()\n",
|
|
" for _ in range(0, iterations): \n",
|
|
" x.sin()\n",
|
|
" end = time.time()\n",
|
|
" return(end - start)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 101,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def time_cpu_operation_repetition(size, iterations):\n",
|
|
" x = torch.rand(size, size, device=torch.device(\"cpu\"))\n",
|
|
" start = time.time()\n",
|
|
" for _ in range(0, iterations): \n",
|
|
" x.sin()\n",
|
|
" end = time.time()\n",
|
|
" return(end - start)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 126,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def get_cuda_cpu_times_with_iterations(iterations):\n",
|
|
" cpuTimes = []\n",
|
|
" cudaTimes = []\n",
|
|
" for i in iterations:\n",
|
|
" cpuTimes += [time_cpu_operation_repetition(300, i)]\n",
|
|
" cudaTimes += [time_torch_operation_repetition(300, i)]\n",
|
|
" return cpuTimes, cudaTimes"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 125,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"iterations = range(1, 500, 5)\n",
|
|
"cpu_t, cuda_t = get_cuda_cpu_times_with_iterations(iterations)\n",
|
|
"plot_cuda_vs_cpu(cpu_t, cuda_t, iterations, xLab=\"Number of Operations\")"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "ml",
|
|
"language": "python",
|
|
"name": "ml"
|
|
},
|
|
"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.3"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 4
|
|
}
|