<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.3">Jekyll</generator><link href="https://womiko.me/feed.xml" rel="self" type="application/atom+xml" /><link href="https://womiko.me/" rel="alternate" type="text/html" /><updated>2023-05-21T18:02:51+00:00</updated><id>https://womiko.me/feed.xml</id><title type="html">Wojtek Mikołajczyk’s tech blog</title><subtitle>It's all about Machine Learning</subtitle><author><name>Wojtek Mikołajczyk</name></author><entry><title type="html">Machine Learning books I recommend</title><link href="https://womiko.me/2022/09/03/ml-books-recommendations.html" rel="alternate" type="text/html" title="Machine Learning books I recommend" /><published>2022-09-03T17:00:00+00:00</published><updated>2022-09-03T17:00:00+00:00</updated><id>https://womiko.me/2022/09/03/ml-books-recommendations</id><content type="html" xml:base="https://womiko.me/2022/09/03/ml-books-recommendations.html">&lt;p&gt;Some time ago I realized that I like to learn new things in a structured way.&lt;br /&gt;
That’s why I like learning new things from books.&lt;br /&gt;
There are tons of Machine Learning books available, I’m pretty sure that no one can read them all :)&lt;br /&gt;
That’s why it’s so important to choose the right ones.&lt;/p&gt;

&lt;h4 id=&quot;the-list-of-books-i-have-read-and-i-can-recommend&quot;&gt;The list of books I have read and I can recommend:&lt;/h4&gt;
&lt;div style=&quot;overflow:auto; padding-bottom: 25px;&quot;&gt;
  &lt;p&gt;&lt;img src=&quot;/assets/images/100p_ml_book.jpeg&quot; alt=&quot;image&quot; title=&quot;The Hundred-Page Machine Learning Book&quot; width=&quot;225&quot; style=&quot;float:left; padding-right:10px; padding-top: 5px;&quot; /&gt;
&lt;strong&gt;The Hundred-Page Machine Learning Book - Andriy Burkov&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;This is great as the first book about Machine Learning.&lt;br /&gt;
It greatly introduces all key concepts and it’s very concise - it literally consists of a little bit more than 100 pages.&lt;br /&gt;
This book might also be useful if you need to quickly refresh some base knowledge about a particular topic.&lt;br /&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div style=&quot;overflow:auto; padding-bottom: 25px;&quot;&gt;
  &lt;p&gt;&lt;img src=&quot;/assets/images/ml_eng_book.jpeg&quot; alt=&quot;image&quot; title=&quot;Machine Learning Engineering&quot; width=&quot;225&quot; style=&quot;float:left; padding-right:10px; padding-top: 5px;&quot; /&gt;
&lt;strong&gt;Machine Learning Engineering - Andriy Burkov&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;This book introduces key concepts of working on a real Machine Learning project.&lt;br /&gt;
It describes that there is much more than Machine Learning algorithms and their mathematical background. It’s about all aspects of Machine Learning! :)&lt;br /&gt;
From starting a project, defining goals and metrics, through acquiring the data, data preprocessing, and feature engineering, to the model training and deployment on production.&lt;br /&gt;
The book gives a good overview of all these areas.&lt;br /&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div style=&quot;overflow:auto; padding-bottom: 25px;&quot;&gt;
  &lt;p&gt;&lt;img src=&quot;/assets/images/homl_book.jpeg&quot; alt=&quot;image&quot; title=&quot;Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow&quot; width=&quot;225&quot; style=&quot;float:left; padding-right:10px; padding-top: 5px;&quot; /&gt;
&lt;strong&gt;Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow - Aurélien Géron&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;This is a Machine Learning “Bible”.&lt;br /&gt;
I loved this book. It gives a deep understanding of key Machine Learning algorithms and Neural Networks.&lt;br /&gt;
It also consists of hands-on exercises which sometimes are a little challenging, but all of them are provided the right answers or code snippets.&lt;br /&gt;
This book does exactly what the title says - it provides you required knowledge and gives you hands-on experience while completing the exercises.&lt;br /&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div style=&quot;overflow:auto; padding-bottom: 25px;&quot;&gt;
  &lt;p&gt;&lt;img src=&quot;/assets/images/nlp_with_transformers_book.jpeg&quot; alt=&quot;image&quot; title=&quot;Natural Language Processing with Transformers&quot; width=&quot;225&quot; style=&quot;float:left; padding-right:10px; padding-top: 5px;&quot; /&gt;
&lt;strong&gt;Natural Language Processing with Transformers - Lewis Tunstall, Leandro von Werra, Thomas Wolf&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;This book shows how to use Hugging Face Transformers for Natural Language Processing.&lt;br /&gt;
It describes the required theory and gives practical examples of using the whole Hugging Face ecosystem to effectively deliver NLP models for different tasks.&lt;br /&gt;
The book addresses also topics related to large-scale training, like multi-GPU training and making models efficient using knowledge distillation or quantization.&lt;br /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I can greatly recommend the books mentioned above to Machine Learning enthusiasts.&lt;br /&gt;
The first two are more like an introduction to the topic, and the two latter are more specialized.&lt;br /&gt;
&lt;br /&gt;
If you have any other Machine Learning books that you want to recommend - feel free to put them in the comments section below :)&lt;/p&gt;</content><author><name>Wojtek Mikołajczyk</name></author><category term="machine" /><category term="learning" /><category term="ml" /><category term="machine-learning" /><category term="books" /><category term="training" /><category term="course" /><category term="python" /><summary type="html">Some time ago I realized that I like to learn new things in a structured way. That’s why I like learning new things from books. There are tons of Machine Learning books available, I’m pretty sure that no one can read them all :) That’s why it’s so important to choose the right ones.</summary></entry><entry><title type="html">How to start a machine learning project?</title><link href="https://womiko.me/2022/08/28/starting-ml-project.html" rel="alternate" type="text/html" title="How to start a machine learning project?" /><published>2022-08-28T17:00:00+00:00</published><updated>2022-08-28T17:00:00+00:00</updated><id>https://womiko.me/2022/08/28/starting-ml-project</id><content type="html" xml:base="https://womiko.me/2022/08/28/starting-ml-project.html">&lt;p&gt;Machine learning is getting more and more popular nowadays. Companies are creating or extending their R&amp;amp;D teams. Having a product that delivers some kind of AI solution is prestigious.&lt;/p&gt;

&lt;p&gt;In terms of software development, building business web applications is a quite mature field. There are well-known practices and methodologies on how to plan, design, and implement a solution. But AI is quite a greenfield and when it comes to building AI solutions, it’s a big challenge how to do it well.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/rocket.png&quot; alt=&quot;image&quot; title=&quot;starting a project&quot; width=&quot;200&quot; style=&quot;display:block; margin-left:auto; margin-right:auto&quot; /&gt;&lt;br /&gt;
&lt;span style=&quot;display:table; margin-left:auto; margin-right:auto; font-size:12px;&quot;&gt;image: &lt;a href=&quot;https://www.flaticon.com/free-icons/rocket&quot; title=&quot;rocket icons&quot;&gt;Rocket icons created by Freepik - Flaticon&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Machine learning and in general AI are very fast-paced in terms of development. The SOTA (State Of The Art) models and solutions are changing rapidly, and new tools and libraries are being released.&lt;/p&gt;

&lt;p&gt;Business people are often not aware of what is possible, and where are the limitations of AI solutions, they might be driven by AI hype from clickbait news. Data scientists might be excellent in terms of machine learning knowledge and statistics but they might lack project planning skills and they might not be able to deliver large-scale production-grade solutions. Machine learning engineers should be somewhere between software engineers, data engineers, DevOps, and data scientists to be able to support data scientists with developing well-crafted AI solutions for production - but they might be more focused on making an interesting project in terms of their development, and not optimally meeting business requirements. Project managers might have trouble with understand well project risks because it requires some prior machine learning knowledge.&lt;/p&gt;

&lt;p&gt;The things described above might be some of the challenges, but there is one more, probably the biggest of them. Machine learning and AI have an experimental nature. It’s almost impossible to tell if the designed solutions will work in practice or not. It requires experiments, and usually a lot of iterations on the whole process of collecting the data, cleaning and preprocessing, and model training.&lt;/p&gt;

&lt;p&gt;Luckily, those problems are common in this area and a lot more people have occurred them. There are some good practices on how to start a machine learning project properly, what are the most important points to define, and in general, how to approach developing an AI solution.&lt;/p&gt;

&lt;h4 id=&quot;machine-learning-project-checklist&quot;&gt;Machine Learning Project Checklist:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;what is the goal?&lt;/li&gt;
  &lt;li&gt;what is the metric of success?&lt;/li&gt;
  &lt;li&gt;what is the minimum value of the metric of success to go live with the solution?&lt;/li&gt;
  &lt;li&gt;can it be solved with a non-machine learning solution?&lt;/li&gt;
  &lt;li&gt;what is a better way to solve this problem (machine learning or non-machine learning solution) and why?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;assuming the decision is to go with the machine learning approach&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;what data will be used?&lt;/li&gt;
  &lt;li&gt;what is the cost of acquiring/labeling the data?&lt;/li&gt;
  &lt;li&gt;what will be a baseline model?&lt;/li&gt;
  &lt;li&gt;what are the risks of the project?&lt;/li&gt;
  &lt;li&gt;what are the unknowns?&lt;/li&gt;
  &lt;li&gt;can this problem be simplified and how?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s good to address those questions while starting a machine learning project. The business should discuss that with the development team and they should together come up with the answers to those questions. It’s worth spending more time on project planning than starting without a clear vision and some misunderstanding between business and an AI development team - to deliver in a few months solution that… cannot be used in production because it lacks some features or is not good enough.&lt;/p&gt;

&lt;p&gt;The Machine Learning Project Checklist was created based on my own experience and on the &lt;a href=&quot;http://mlebook.com/&quot;&gt;Machine Learning Engineering by Andriy Burkov&lt;/a&gt; which I greatly recommend reading! :)&lt;/p&gt;

&lt;p&gt;If you have any more ideas about starting a machine learning project, I greatly encourage you to put them in the comments section below :)&lt;/p&gt;</content><author><name>Wojtek Mikołajczyk</name></author><category term="machine" /><category term="learning" /><category term="ml" /><category term="machine-learning" /><category term="python" /><category term="project" /><category term="start" /><summary type="html">Machine learning is getting more and more popular nowadays. Companies are creating or extending their R&amp;amp;D teams. Having a product that delivers some kind of AI solution is prestigious.</summary></entry><entry><title type="html">The mystery of the memory leak…</title><link href="https://womiko.me/2020/11/30/the-memory-leak.html" rel="alternate" type="text/html" title="The mystery of the memory leak…" /><published>2020-11-30T09:00:00+00:00</published><updated>2020-11-30T09:00:00+00:00</updated><id>https://womiko.me/2020/11/30/the-memory-leak</id><content type="html" xml:base="https://womiko.me/2020/11/30/the-memory-leak.html">&lt;p&gt;Some time ago, I was developing some data processing script in Python. I was sure I did everything well - my script worked as intended, all unit tests passed and I even tested the script on small data, and it worked properly. But I encountered an interesting problem, the execution failed…&lt;/p&gt;

&lt;p&gt;Everything seemed to be fine until… I ran it to process a HUGE (1 400 000 files, 50GB) volume of data. The script was massively processing big data but suddenly a container, in which the script was run, was killed due to Out Of Memory error. The script was wrapped into a Docker container and deployed on the Kubernetes with defined maximum usage of RAM limit. So, what actually happened?&lt;/p&gt;

&lt;p&gt;In such cases, it’s always a good idea to check for CPU and memory usage over time graphs.
I checked the graph of memory usage over time, and it looked like that.
&lt;img src=&quot;/assets/images/memory_usage_over_time.png&quot; alt=&quot;image&quot; title=&quot;memory usage over time&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I saw that memory usage constantly grows. It means that my script allocates more and more memory for objects, much faster than it frees some memory. This problem is called a &lt;em&gt;MEMORY LEAK&lt;/em&gt;. But, what is the cause of that?…&lt;/p&gt;

&lt;p&gt;I had to process a big volume of data, so to speed up processing I used multithreading in Python. The threads were my first suspect, so I started to analyze how I use them.&lt;/p&gt;

&lt;p&gt;I needed to provide GCS (Google Cloud Storage) client object for each thread to be able to perform my data processing. Google Cloud Storage client isn’t thread-safe so each thread requires its own copy of that. During the script execution, a bunch of threads is working in a pool, performing input-output heavy operations in a loop. Probably the problem lies in a way of storing data in the threads. Let’s verify that!&lt;/p&gt;

&lt;p&gt;I performed a code-review together with my friend and he helped me to find that this actually is a problem. 
Each thread created a seemingly harmless GCS Client object every time the operation is performed. We’ve found out that it’s not actually harmless - it was the root cause of the memory leak!&lt;/p&gt;

&lt;p&gt;The solution was to use &lt;em&gt;threading.local()&lt;/em&gt; in Python (&lt;a href=&quot;https://docs.python.org/3.8/library/threading.html#threading.local&quot;&gt;docs.python.org/…#threading.local&lt;/a&gt;) - which allows storing data for each thread. After applying this fix - GCS client object was created only once for each thread. The memory leak problem is solved now! :)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Code with the Memory Leak issue&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;google.cloud&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;storage&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SomeClass&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;project_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;project_id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;project_id&lt;/span&gt;

    &lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;property&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;storage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;project&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;project_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Code after applying fix - using threading.local()&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;google.cloud&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;storage&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SomeClass&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;project_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;project_id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;project_id&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;thread_local&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;threading&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

    &lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;property&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;gcs_client&quot;&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;thread_local&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;__dict__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;thread_local&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gcs_client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;storage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;project&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;project_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;thread_local&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gcs_client&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After applying the fix, the script was able to process all this data in around 5 hours, thanks to multi-threaded operations which sped up the whole thing a lot.&lt;/p&gt;

&lt;h4 id=&quot;key-takeaways&quot;&gt;Key takeaways:&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;some problems will appear ONLY when Python script is run on a MASSIVE scale&lt;/li&gt;
  &lt;li&gt;memory leak occurs when your application allocates more RAM than it frees in time&lt;/li&gt;
  &lt;li&gt;you can spot a memory leak by inspecting memory usage over time graph&lt;/li&gt;
  &lt;li&gt;memory leaks are pretty tough to debug - usually, the only message you get is this “Out Of Memory” error&lt;/li&gt;
  &lt;li&gt;when encountered a memory leak - then your goal is to find this piece of code which “eats” memory :)&lt;/li&gt;
  &lt;li&gt;Google Cloud Storage Client object isn’t thread-safe and leaves some leftovers in the memory&lt;/li&gt;
  &lt;li&gt;threading in Python might be tricky - if you encounter some problems it’s often good to take a step back to get a better understanding of what’s going on under the hood&lt;/li&gt;
  &lt;li&gt;threading.local() in Python allows storing some data per thread&lt;/li&gt;
&lt;/ul&gt;</content><author><name>Wojtek Mikołajczyk</name></author><category term="python" /><category term="memory-leak" /><category term="gcs" /><category term="google-cloud-storage" /><summary type="html">Some time ago, I was developing some data processing script in Python. I was sure I did everything well - my script worked as intended, all unit tests passed and I even tested the script on small data, and it worked properly. But I encountered an interesting problem, the execution failed…</summary></entry></feed>