# 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 and convenient:

if self.config.control_variate:
    return -x * self.config.learning_rate

if self.config.distribution.name == 'normal':
    return norm(x, self.config.distribution.mu, self.config.distribution.sigma)

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

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

Execution

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

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

Results

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

o = Observations('s3://bucket/results').find_by_most_recent_task().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 more 'I will clean this up later' excuses. Move faster from idea to result to publication.

Get started →