# Buggy code
def save(self, fname, protocol=2):
    """Save AnnoyIndexer instance to disk.

    Parameters
    ----------
    fname : str
        Path to output. Save will produce 2 files:
        `fname`: Annoy index itself.
        `fname.dict`: Index metadata.
    protocol : int, optional
        Protocol for pickle.

    Notes
    -----
    This method saves **only the index**. The trained model isn't preserved.

    """
    self.index.save(fname)
    d = {
        "f": self.model.vector_size,
        "num_trees": self.num_trees,
        "labels": self.labels,
    }
    with utils.open(fname + ".dict", "wb") as fout:
        _pickle.dump(d, fout, protocol=protocol)


# Traceback (FileNotFoundError)
[INFO]  2018-01-21T20:44:59.613Z    f2689816-feeb-11e7-b397-b7ff2947dcec    testing keys in event dict
[INFO]  2018-01-21T20:44:59.614Z    f2689816-feeb-11e7-b397-b7ff2947dcec    loading model from s3://data-d2v/trained_models/model_law
[INFO]  2018-01-21T20:44:59.614Z    f2689816-feeb-11e7-b397-b7ff2947dcec    loading Doc2Vec object from s3://data-d2v/trained_models/model_law
[INFO]  2018-01-21T20:44:59.650Z    f2689816-feeb-11e7-b397-b7ff2947dcec    Found credentials in environment variables.
[INFO]  2018-01-21T20:44:59.707Z    f2689816-feeb-11e7-b397-b7ff2947dcec    Starting new HTTPS connection (1): s3.eu-west-1.amazonaws.com
[INFO]  2018-01-21T20:44:59.801Z    f2689816-feeb-11e7-b397-b7ff2947dcec    Starting new HTTPS connection (2): s3.eu-west-1.amazonaws.com
[INFO]  2018-01-21T20:45:35.830Z    f2689816-feeb-11e7-b397-b7ff2947dcec    loading wv recursively from s3://data-d2v/trained_models/model_law.wv.* with mmap=None
[INFO]  2018-01-21T20:45:35.830Z    f2689816-feeb-11e7-b397-b7ff2947dcec    loading syn0 from s3://data-d2v/trained_models/model_law.wv.syn0.npy with mmap=None
[Errno 2] No such file or directory: 's3://data-d2v/trained_models/model_law.wv.syn0.npy': FileNotFoundError
Traceback (most recent call last):
File "/var/task/handler.py", line 20, in infer_handler
event['input_text'], event['model_file'], inferred_docs=10)
File "/var/task/infer_doc.py", line 26, in infer_docs
model = load_model(model_file)
File "/var/task/infer_doc.py", line 21, in load_model
return Doc2Vec.load(model_file)
File "/var/task/gensim/models/word2vec.py", line 1569, in load
model = super(Word2Vec, cls).load(*args, **kwargs)
File "/var/task/gensim/utils.py", line 282, in load
obj._load_specials(fname, mmap, compress, subname)
File "/var/task/gensim/models/word2vec.py", line 1593, in _load_specials
super(Word2Vec, self)._load_specials(*args, **kwargs)
File "/var/task/gensim/utils.py", line 301, in _load_specials
getattr(self, attrib)._load_specials(cfname, mmap, compress, subname)
File "/var/task/gensim/utils.py", line 312, in _load_specials
val = np.load(subname(fname, attrib), mmap_mode=mmap)
File "/var/task/numpy/lib/npyio.py", line 372, in load
fid = open(file, "rb")
FileNotFoundError: [Errno 2] No such file or directory: 's3://data-d2v/trained_models/model_law.wv.syn0.npy'

# Fixed code
def save(self, fname, protocol=utils.PICKLE_PROTOCOL):
    """Save AnnoyIndexer instance to disk.

    Parameters
    ----------
    fname : str
        Path to output. Save will produce 2 files:
        `fname`: Annoy index itself.
        `fname.dict`: Index metadata.
    protocol : int, optional
        Protocol for pickle.

    Notes
    -----
    This method saves **only the index**. The trained model isn't preserved.

    """
    self.index.save(fname)
    d = {
        "f": self.model.vector_size,
        "num_trees": self.num_trees,
        "labels": self.labels,
    }
    with utils.open(fname + ".dict", "wb") as fout:
        _pickle.dump(d, fout, protocol=protocol)