From d6685d360318c2c527d5afb2338baf194d8ea0c8 Mon Sep 17 00:00:00 2001 From: Lorenzo Drudi Date: Fri, 10 May 2024 10:48:06 +0200 Subject: [PATCH 1/2] feat(viz): print experiment's cost. --- demo.ipynb | 44 ++++++++++++++------ openai_cost_logger/openai_cost_logger_viz.py | 20 ++++++++- 2 files changed, 50 insertions(+), 14 deletions(-) diff --git a/demo.ipynb b/demo.ipynb index aca82d4..484582b 100644 --- a/demo.ipynb +++ b/demo.ipynb @@ -130,7 +130,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -157,7 +157,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -177,7 +177,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -198,7 +198,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -212,7 +212,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -236,7 +236,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -272,14 +272,14 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Total cost: 4.4e-05 (USD)\n" + "Total cost: 5.9e-05 (USD)\n" ] } ], @@ -290,15 +290,15 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "gpt-3.5-turbo-0125: 4.2e-05 (USD)\n", - "text-embedding-ada-002: 2e-06 (USD)\n" + "gpt-3.5-turbo-0125: 5.6e-05 (USD)\n", + "text-embedding-ada-002: 3e-06 (USD)\n" ] } ], @@ -309,12 +309,12 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "metadata": {}, "outputs": [ { "data": { - "image/png": "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zqh///769ttvNXz4cEki1AHAf7k8jr733ns6ceKEgoODJf360sS5c+d04MABVaxYUQ6Hw5Wlllv8qwXj7d+/X1FRUZo7d6569eql999/X++9957y8vIUEBCgY8eOKS0tTVOnTtV9992nhIQEXbp0SV9//bWrSwcAt/DbcXTWrFl65513ZLfbJf36S3D//v313Xff6dSpU/xi7CL81GE0y7KUkpKie+65R//4xz/Ur18/vfjii/ryyy/l4eGhHj16KCIiQpcuXdKWLVskSQcPHlRwcLBatWrl4uoBwPUKGkdfeOEFLVu2TD4+PpJ+DXZ5eXlq3ry5MjIyXFlyucYNcBjNZrMpMjJS1apVk/TLANWpUyf5+Pjo5MmTqlWrlgYNGiQvLy+NHj1a/fr102effaYhQ4aoSpUqsizL+SwJAJRHBY2jkZGRql69urKysuTr6+vs27hxY3311Vd65ZVXXFVuuUewg3F++8JDUFCQ8882m02rVq1SrVq1nFObNGrUSBMmTFDbtm21e/duLVmyRA0bNnT2B4DyprDj6H+HOkmqWbOmXn31VQUEBPCLsYvYLN5HhgF27typ7777Lt/bWZddHlwu//eBBx5Q//79NXjwYO3du1cXLlxQWFiYC6oGAPdxM+PopUuX1KxZMxdUjd/iih2M0LdvX1WuXFlBQUG6/fbb5XA4ZFmWPDw8nL8xXv5v1apV1aBBAz3zzDNat26d3nvvPVeWDgBugXHUDLw8gTLN4XDop59+UosWLTRgwAC9//77zlsIHh4ekqSpU6fqmWeekfTLN03MnTtXcXFxstls2rBhgzp27OjKUwAAl2IcNQvBDmXO5acHLg88np6eql27ttq0aaPs7GwtWbJEknT+/Hl169ZNW7ZsUVxcnKRfbjXExsZq2bJleuONN5wPAwNAecI4ai6esUOZ8cMPP2jy5MkKDg5WbGysbr31VknSP/7xD33yySeaNWuW3n//fX366afy9fXVjBkz9PPPP6tp06YurhwA3APjqPm4YocyYfXq1br//vt122236cCBA3riiSc0Z84cSVL9+vXVpEkTSdL69ev19ddfy263q3bt2s7BiBnQAZR3jKPlA8EOZcKePXt0xx13aPz48ZoxY4aio6O1fPly7d69W999950SExPVsmVLVaxYUW+88YYsy9Lu3bud2zMDOoDyjnG0fOCt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", + "image/png": "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7JOrt2IDAgJ06tQpXbx4UZUqVcq27pVXXpG7u3ueFgcAAAD75SrY3fL7UCdJ1apVe+BiAAAAcP/suhU7ffp03bhxw+6dzpw5k68VAwAAKGB2BbuxY8fmKqiNHz9e58+fv++iAAAAkHt23Yo1DENdu3ZViRL23bm9fv36AxUFAACA3LMrqb399tu52mnfvn1VsWLF+yoIAAAA9ydfgh0AAAAKXq7msQMAAIDzItgBAACYBMEOAADAJAh2AAAAJpHrYDdp0iRdu3bttvbr169n++5YAAAAFKxcB7uJEycqNTX1tvZr165p4sSJeVIUAAAAci/Xwc4wDFksltva9+7dy9x1AAAADmTfV0lIqlChgiwWiywWi+rVq5ct3GVlZSk1NVXPPvtsvhQJAACAe7M72E2bNk2GYWjYsGGaOHGiPDw8bOtcXFzk6+urwMDAXB18+/btmjx5snbv3q2EhAStWLFCISEhd+y/detWde7c+bb2hIQEeXl55erYAAAAZmN3sAsLC5Mk+fn5KSgoyO7vjb2btLQ0BQQEaNiwYXr88cft3u7o0aNyd3e3fa5ateoD1wIAAFDY5Tqdubm56fDhw2rSpIkkadWqVZo/f778/f31zjvvyMXFxe599ezZUz179sxtCapatarKly+f6+0AAADMLNcvT4waNUo///yzJOnEiRPq37+/ypQpo2XLlmn8+PF5XmBOmjVrpmrVqumRRx7Rzp0779o3PT1dKSkp2RYAAAAzynWw+/nnn9WsWTNJ0rJly9SxY0ctXrxY0dHR+uabb/K6vmyqVaummTNn6ptvvtE333wjb29vderUSXv27LnjNpGRkfLw8LAt3t7e+VojAACAo+T6VqxhGLJarZKkjRs3qk+fPpIkb29vXbhwIW+r+5369eurfv36ts/t27fX8ePH9fHHH+urr77KcZuIiAiNGzfO9jklJYVwBwAATCnXwa5Vq1Z677331K1bN23btk0zZsyQJJ08eVKenp55XuC9tGnTRjt27LjjeldXV7m6uhZgRQAAAI6R62A3bdo0DRo0SCtXrtSf//xn1alTR5K0fPlytW/fPs8LvJe4uDhVq1atwI9rD9/X1zi6BPzOqQ97O7oEALhv/FxxTs70syXXwa5p06bav3//be2TJ09W8eLFc7Wv1NRUHTt2zPb55MmTiouLU8WKFVWzZk1FRETo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", "text/plain": [ "
" ] @@ -328,6 +328,24 @@ "OpenAICostLoggerViz.plot_cost_by_day(path=log_folder)" ] }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Cost of 'demo': 5.9e-05 (USD)\n" + ] + } + ], + "source": [ + "# Print cost of the demo experiment\n", + "OpenAICostLoggerViz.print_experiment_cost(experiment=\"demo\", path=log_folder)" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/openai_cost_logger/openai_cost_logger_viz.py b/openai_cost_logger/openai_cost_logger_viz.py index dcf689e..39092a3 100644 --- a/openai_cost_logger/openai_cost_logger_viz.py +++ b/openai_cost_logger/openai_cost_logger_viz.py @@ -119,4 +119,22 @@ def plot_cost_by_day(path: str = DEFAULT_LOG_PATH, last_n_days: int = None) -> N path=path, strftime_aggregator="%Y-%m-%d", last_n_days=last_n_days - ) \ No newline at end of file + ) + + @staticmethod + def print_experiment_cost(experiment: str, path: str = DEFAULT_LOG_PATH) -> None: + """Print the cost of the specified experiment. The name is case-insensitive. + + Args: + experiment (str): The experiment name. + path (str, optional): Cost logs directory. Defaults to DEFAULT_LOG_PATH. + This method reads all the files in the specified directory. + """ + cost = 0 + for filename in os.listdir(path): + if filename.endswith(".json"): + with open(Path(path, filename), mode='r') as file: + data = json.load(file) + if "experiment_name" in data and data["experiment_name"].lower() == experiment.lower(): + cost += data["total_cost"] + print(f"Cost of '{experiment}': {round(cost, 6)} (USD)") \ No newline at end of file From 45ff25433630d654a8a762ad071a1d91741a68a2 Mon Sep 17 00:00:00 2001 From: Lorenzo Drudi Date: Fri, 10 May 2024 10:50:34 +0200 Subject: [PATCH 2/2] Code refactor. --- openai_cost_logger/openai_cost_logger_viz.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openai_cost_logger/openai_cost_logger_viz.py b/openai_cost_logger/openai_cost_logger_viz.py index 39092a3..156c2fe 100644 --- a/openai_cost_logger/openai_cost_logger_viz.py +++ b/openai_cost_logger/openai_cost_logger_viz.py @@ -121,6 +121,7 @@ def plot_cost_by_day(path: str = DEFAULT_LOG_PATH, last_n_days: int = None) -> N last_n_days=last_n_days ) + @staticmethod def print_experiment_cost(experiment: str, path: str = DEFAULT_LOG_PATH) -> None: """Print the cost of the specified experiment. The name is case-insensitive.