macOS vs Windows WSL vs Linux

As a computer vision freelancer, what would you recommend using as a workstation? Mac, windows WSL or Linux? :open_mouth:

OS

I’m partial to using Linux personally, however it might depend on your customers. If you might need to do a lot of development for .NET systems, then Windows may make more sense. MacOS isn’t bad for dev work, but for me, I wouldn’t choose it if I didn’t have to. Depending if you need a GPU, and which manufacturer you go with (NVIDIA, AMD, Intel), it might also guide a bit more of your OS choice.

Desktop

Highly recommend a desktop/rackmount workstation (I’ll just refer to them as desktop here forward, but either form factor), especially if you need to train models. You’ll get the best performance using a desktop, and depending on if you build or buy from an integrator that uses consumer hardware, you’d be able to upgrade components as needed. Desktops are also nice b/c they can use more power and have better thermal management than a laptop, so you’re likely to get better overall performance.

Laptop

I have a particular soft spot for the Framework laptops since they’re modular/upgradable. That said, I was issued a Macbook for Ultralytics, and it’s been quite nice. The M-series chips are snappy and you can use the GPU + shared memory for accelerating models. Realistically, you’ll probably need something mobile, even if you use the desktop/server as your primary workstation. With things like VS Code Remote Tunnel or Wireguard VPN, you’ll be able to access your workstation on the go, so you could go with something lighter. Before getting the Macbook, I traveled with a Chromebook and used a tunnel to access a workstation at home.

Pricing

Now is a tough time to buy/build a PC since memory (RAM) prices are crazy. Apple pricing is fairly stable, so you might be able to get more memory (remember it’s shared with the GPU tho) for you money going that route. GPU prices have started going up, and are likely to continue going up this year. Maybe not as much for some of the more workstation focused cards, but something to consider. You might also want to check with custom PC integrators like System76, Boxx, or Puget Systems (to name a few), as they might be able to help spec out what you need and get you a price quote.

Thank you for your detailed reply. Right now Im very much in the beginning so I dont know which future customers I will have. I have a background in production, so maybe I would gravitate towards that. Do you know which OS is dominating in such an environment?

I do have an jetson orin nano, so I guess I have a Linux computer at home even if its a small one. So maybe I go for the MacBook while having the jetson if I need Linux.

Desktop I guess is good in the future but right now Im thinking just learning through some simple end to end jobs with a laptop, and use colab GPU.

I presume you mean manufacturing? Nut clear what ā€œproductionā€ would be otherwise, so some clarification would help.

MacBook would be a solid start for sure. With Docker, you can even run Linux containers, which should operate the same as Linux, but even better, be portable to any machine. You can also get Parallels for MacOS and run Windows. Having a Jetson could definitely help, although the Orin Nano might article a bit with heavier workloads.

Deployment options or PS is going to vary a lot by organization. Really thought, it’s probably going to be Linux or Windows, and very much depends on the organization. When I was in manufacturing, there was one org that was Windows everything, so deployment had to use C#, and deployments were workstations for each production cell. Another org deployed everything to a Linux cluster, and all data streamed back to that cluster. So it could go either way easily.

Ah yes I mean manufacturing, in sweden we call it production so I sometimes mix them up :smiling_face: Ok so MacBook seems like a good start then. Would a MacBook with 512GB do the job or is 1TB recommend?

So I’ve never done a job to a customer so I’m not fully aware of how much of the system is expected to be delivered. For example if a customer wants to be able to classify an image on their custom data. In my mind I would first ask them for the data they have and have a quick look if its even enough data. If it is, I would do a PoC model and show that its possible to have a model working on the data at least. Then I would build a docker image with fastAPI where the customer can give the path to their image and out comes the prediction with some extra metadata maybe. If they want to be able to do both images and streams then I would set it up for that in the container. And then my job is done.

Am I far off with that example?

Since MacBooks don’t have upgradable storage our RAM, I recommend purchasing the most possible for both that you can afford. You will need large quantities of RAM for model training, however you won’t be able to use your laptop for any heavy tasks, and additional storage for large datasets. You may also want to look at cloud-based options for training, like the recently launched Ultralytics Platform.

That’s a start, but you may also need to consult on what data to collect and how much of each.

Certainly not a bad step, but might not always be necessary, will depend on the dataset and the customer most likely.

Again, it will depend a lot on the customer here. That might be what they want, it might not. Things can get very complex very quickly. Consider that most customers will likely want to have some kind of record store of these detections, meaning some how they need to be store to a database. Having a detection of something isn’t necessarily going to provide a business with value, usually they want to do something with that detection data, it’s likely that integration would be a part of the scope of work. When I worked in manufacturing, I helped develop the model, but had to work with the team that integrated it into the production system. The integration was to use the detections to decide if a part under inspection should be rejected. Another team handled that code, but I had to provide my support to them, as an independent contractor, it might be expected you would do all of this.
Additionally, you should keep in mind that data changes over time. The objects trained on initially might have certain characteristics, and eventually those characteristics in deployment will start to change. Eventually the model performance will begin to decay, which means that new data will need to be collected, and the model retrained. The scope of who is responsible for when this happens, would be something you’ll need to figure out.

Finally, I’d argue there’s a lot more necessary to just starting a computer vision project. Agreement on the classes, defining project requirements, and identifying constraints, are only a few points that, depending on the customer, could take a month or longer alone. I’ve seen teams argue about object classification definitions for weeks, stifling any progress on model training or deployment. I bring up all these points because it’s important to consider how much work it will actually be. There are some good guides in the documentation like:

that might be useful to review.

Keep in mind, that my experience is from working as an employee, not as an external contractor for computer vision projects; also based in the US. Things may operate somewhat differently, but I figure it’s better to share what could occur so that you can be better prepared. Hopefully things will be much more straightforward than what I have experienced. The key takeaway would be to be extremely rigorous about what your responsibilities are and the definition of project completion are. Having that well defined and sticking to it, will help avoid scope creep and ensure you know what you’re committing to ahead of time.

Thank you again very much for your detailed reply! The challenges you bring up sounds like fun challenges actually. Being very rigorous about the scope is something I have read in several places and that makes sense and something I will practice.

The decaying model is something I have been thinking about as well. But I suppose thats something you could agree on with the customer, that when that happens, you retrain but it will cost them hourly as usual? Sounds like good job opportunity to me if you plan for it.

If I were trying to do this, I would absolutely mention that it would be an entirely new scope/contract. That said, I suspect that most customers will try to do one of the following:

  1. Ask you to teach/show them how to retrain the model
  2. Request that at least one retraining is included (no additional cost) with the base contract

For (1) it might make sense to do this, but I would make it a separate ā€œtrainingā€ fee. Customers will nearly always want to cut costs, and this would likely be one that gets cut from an initial quote. If later they ask for it, you can give them a separate quote with a markup since it wasn’t ā€˜packaged’ as part of the original contract. I’d be wary of (2), as it can easily lead to scope creep and put you on the hook between first delivery and completion of the follow up training. If you ever do agree to this, I’d be extremely clear about responsibilities, and to that effect, being clear about how support is billed after initial delivery. The reason (2) can be very treacherous is b/c I suspect some customers may see ā€œretrainingā€ as an opportunity to completely change the model scope. If they find that the model is not performing well b/c they scoped the project poorly from the start, they may try to use (2) as a way to have you essentially redo the entire project. That’s why I’d recommend avoiding that completely if possible.

One of the biggest problems here might be the actual monitoring solution, setting thresholds, who tracks the changes, and when it makes sense to retrain. AFAIK there’s no ā€œstandardā€ for how to do this. I can think of a handful of ways you could try, but I haven’t tested any, so it’s hard to make a recommendation. As an independent contractor, you’ll probably want to decouple yourself from monitoring the data trends, but help establish what could/should be monitored by the customer. The how, might be worth an entirely separate project, as depending on the customer, it could be a big-ish project.

Thank you for the link, its very helpful! I appreciate the help :folded_hands: Final question, do you have any recommendations on what to focus on when it comes to system glueing? For example, is it essential to understand how to use some cloud service for storage? Perhaps for saving the classified image as you mentioned the customer might want.

For cloud storage, it will likely vary greatly customer to customer. From my experience in manufacturing, there was a lot of concern about intellectual property (IP), so cloud anything was essentially out of the question. There’s such a huge number of various technologies for these types of systems, it’s hard to say which ones to focus on. My recommendation would be to plan on storing locally for the short term, and sending a standard JSON or binary message somewhere (external storage, database, endpoint, etc.). Then if the customer wants to have the images stored somewhere long term, then they will need to build a system to egress the image data off the local system within whatever time period. That way you don’t have to worry about the bulk storage needs, only the short term storage and delivering the detection results.