Skip to content

Starting is finishing - my project philosophy

I finish projects by starting them

Published at: 2024-03-07

Why is it hard to start a project? My theory is that starting a project is synonymous with finishing it.

My project starts as a bullet point in my planner. For example, umx.cpp (inference for the pretrained weights/model of Open-Unmix written in pure C++ without using PyTorch) started off as "Copy ggerganov/llama.cpp or whisper.cpp and adapt it for Open-Unmix."

umx.cpp

June 30, 2023 marked the first commit of umx.cpp, and by July, I had the base parts (most of the inference minus the last complicated wiener filtering step) working. By September, I had all of the inference working.

I was of course hesitant when considering beginning umx.cpp. "All" I had to do was clone whisper.cpp and llama.cpp, take a look at how they load the PyTorch tensors in C++, write the math operations on those tensors, that's basically it, right? But the first step is hard because the first step marks the end of the project.

Once I have whisper.cpp and llama.cpp cloned, and I make a first copy of their "dump-weights.py" (or whatever) script, and start modifying it to support Open-Unmix, the end of the project has begun. After that, once dump-weights.py works correctly, I need of course a basic C++ file that prints hello world and loads those dumped weights from their ggml binary format. Once I have those tensors, let me test a simple first tensor operation - a linear layer with a bias, e.g. x = A*x + b.

After that, the rest is just more of the same. It took a long time to finish it, but the point I'm making is that there are no discrete "beginning", "middle", or "end" phases. The beginning - "let me just copy the first script, write the first README, print the first hello statement, print the first tensor..." just snowballs until the project is finished. Projects have only three phases: not begun, started, and finished.

demucs.cpp

After umx.cpp, demucs.cpp was both much easier and much harder. Easier because doing something once is the best way to make sure you can do it again, and harder because I pretty much knew again that starting it would be finishing it.

Demucs.cpp is "easy": copy umx.cpp, repeat it but with Demucs instead of Open-Unmix. In actuality it was brutally difficult since the math operations behind it were much more involved (cross-transformers and convolutional layers are harder to implement than an LSTM and linear layers).

My thesis

My Master's thesis went more or less the same way. I was staring down the barrel of having around 1 year to write my whole thesis, and the timeline was making me nervous. But, again, starting is finishing. The day after penning down the todo item "start thesis", I sat down to shape an outline. Then I just kept writing, copy-pasting diagrams, references, and other crap whole-sale from my different other projects, slides, writeups from the last 2 academic years - not for auto-plagiarism, but to slap together raw material in one place before shaping it.

Then I iterated and refined until I had a first draft ready for my advising professor. Of course, we changed a lot of it. But, again, starting the thesis was finishing it. The idea of "if I start, I'll plan out a course of action that will later entail labor in finishing it" is just a fantasy. Once it starts, it's over, there's no stopping it.

Music Demixer Android app

My latest triump, my Music Demixer Android app was sitting in my TODO list, shitting it up. All I had to do was to wrap up all of my effort in tying together demucs.cpp and the advanced paid ensemble models on my pro website into a compelling Android package, where thanks to the NDK (Native Development Kit), most of the C++ code is reusable.

All I had to do was start it, but having it unstarted, unfinished, and as a TODO item is a state that only creates anxiety. Then, I began working on the app in earnest, and it finished within 2 months (February until April for the final production release).

Conclusion

This isn't a blueprint for how to approach your own projects. It's just a way I've grown to look at my own projects and TODO list. Unstarted projects are full of hope, anxiety, and misery. Starting a project, putting your pen to it, is the best thing you can do - and just keep that momentum, don't stop. Before you blink, that shit will be over. And then you have a finished project, which is its own nightmare since it cannot possibly live up to what you expected it could be when it was still a fantasy. But that's just how life goes, I think.

Comments