# At a glance

machinable provides a structured approach to development, execution, and results analysis in machine learning projects.

Development

Take advantage of an expressive syntax to write out project configuration:

deviation: 0.5
components:
    - baseline_model:
        learning_rate: base_learning_rate(2**-7)
        distribution:
          name: normal
          sigma: $.deviation
          mu: 0
        ~heavytailed:
          distribution:
            name: lognormal
            sigma: 1.0
    - biased_model^baseline_model:
        distribution:
          # overwrite mean to introduces some bias
          mu: -0.5
        control_variate: True
    - +.kaggle.sota_model:
        control_variate: True

Configuration retrieval in the corresponding code is straight-forward:

class MyModel(Component):
    def on_create(self):
        if self.config.distribution.control_variate:
            lr = self.config.learning_rate * self.config.alpha

So is capturing of results using tabular records, logging and store.

    def on_execute(self):
        self.record['acc'] = 0.6
        self.log.info('Training finished')
        self.store.write('final_result.p', output_data)

Execution

Rapidly declare experiments in a fluent interface and take advantage of automatic parallelized execution - locally or in the cloud.

expr = Experiment().component('biased_model', 
                        [('~heavytailed', {'learning_rate': lr}) 
                        for lr in (0.25, 0.1, 0.5)]).repeat(3)
execute(expr, 's3://bucket/results', engine='slurm')

Results

Retrieve the configuration, results and execution information you need through a high-level query interface.

o = Storage('s3://bucket/results').components.first()
plot(y=o.records.pluck('acc'), label=o.config.learning_rate)
result = o.store('final_result.p')

Repeat

Share, publish and build on what you have developed - no need to 'clean it up later'. Move faster from idea to result to publication.

Get started →